delegate---特殊的属性 详细解释 及 "目标" 的解释

在我认为委托或者说代理其实只是类的一种特殊属性,只是这样的属性是任意的Id类型的对象,代理是让外部对象调用内部方法的一种实现方法,比如常见的TableView的datasourse,因为内部无法对自己的数据进行加载,所以我们需要在外部对其进行数据操作。
一般情况下是这样的,例如ViewControllerOne里申明了一个delegate和一个代理的方法,ViewControllerTwo中实例化了一个ViewControllerOne的对象,那么我申明ViewControllerOne的代理对象是ViewControllerTwo,(viewControllerOne.delegate=ViewControllerTwo)也就是ViewControllerTwo是ViewControllerOne的一个属性,这之间其实是一种相互包含的关系。

参考 app store 掘金 和 clock demo 详解
 
 
代理就是你在执行一个类的方法时候,想在这个方法里面跳到另一个类执行另一个类的方法,可以将代理设置为另一个类,
 
在IOS里两个UIView窗口之间传递参数方法有很多,比如
 1.使用SharedApplication,定义一个变量来传递.
 2.使用文件,或者NSUserdefault来传递
 3.通过一个单例的class来传递
 4.通过Delegate来传递。
前面3种方法,暂且不说,这次主要学习如何使用通过Delegate的方法来在不同的UIView里传递数据 。
比如: 在窗口1中打开窗口2,然后在窗口2中填入一个数字,这个数字又回传给窗口1。

窗口1
 
delegate---特殊的属性 <wbr>详细解释 <wbr>及 <wbr>"目标" <wbr>的解释
窗口2

delegate---特殊的属性 <wbr>详细解释 <wbr>及 <wbr>"目标" <wbr>的解释
窗口1的数据传给窗口2

delegate---特殊的属性 <wbr>详细解释 <wbr>及 <wbr>"目标" <wbr>的解释
 

 
有一个UIImagePickerController控件在一个UIViewController控件中出生。
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
这两句中谁是代理呢?
我觉得应该是picker是代理。可是代码picker.delegate =self又让我觉得self是代理。还请各位高手解答一下?

解释一下这个代码。
答:
picker.delegate=self;

写成中文大概意思就是:

我是个viewcontroller,我要在我的代码段里处理picker产生的事件,uiimagepickercontroller的delegate协议里支持的方法我都可以接收到。

就是说如果用户在picker做出选择,picker会执行类似如下的方法(当然,是我猜测的):

首先picker.delegate=self;这句,你会把self的指针扔给picker。假设说picker有个变量 id thedelegate; 你执行后 thedelegate 就指向了你的self.

picker接到被点击的事件之后,就会作类似如下的处理:
if (thedelegate respondsToSelector:@selector(imagePickerController:didFinishPickingImage:editingInfo:)
   [thedelegate imagePickerController:picker didFinishPickingImage:image editingInfo:editingInfo];

或者用performselector把一堆参数扔给thedelegate。而这个thedelegate其实就是你设置的self.

另外多说一句,imagePickerController:didFinishPickingImage:editingInfo:在3.0里已经deprecated了。

 
 
最简单的说法其实就是callback。
delegate字面上是 代理的意思,也就是替别人做事
 
 1.首先定义个一委托UIViewPassValueDelegate用来传递值
 
@protocol UIViewPassValueDelegate

- (void)passValue:(NSString *)value;

@end


 
 这个protocol 就是用来传递值
 
2.在窗口1的头文件里,声明delegate
#import <UIKit/UIKit.h>#import "UIViewPassValueDelegate.h"@interface DelegateSampleViewController : UIViewController <UIViewPassValueDelegate>{
    UITextField 
*_value;
}
@property(nonatomic, retain) IBOutlet UITextField 
*value;

- (IBAction)buttonClick:(id)sender;

@end


 并实现这个委托
 
- (void)passValue:(NSString *)value
{
  self.value.text 
= value;
    NSLog(
@"the get value is %@", value);
}


 
 button的Click方法,打开窗口2,并将窗口2的delegate实现方法指向窗口1。
- (IBAction)buttonClick:(id)sender
{
    ValueInputView 
*valueView = [[ValueInputView alloc] initWithNibName:@"ValueInputView" bundle:[NSBundle mainBundle]];
    valueView.
delegate = self;
    [self setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    [self presentModalViewController:valueView animated:YES];
}


 
 第二个窗口的实现
 .h 头文件
 
#import <UIKit/UIKit.h>#import "UIViewPassValueDelegate.h"@interface ValueInputView : UIViewController {

    NSObject
<UIViewPassValueDelegate> * delegate;
    UITextField 
*_value;
}

@property(nonatomic, retain)IBOutlet UITextField 
*value;
@property(nonatomic, retain) NSObject
<UIViewPassValueDelegate> * delegate;

- (IBAction)buttonClick:(id)sender;

@end



 
 .m实现文件
 
#import "ValueInputView.h"@implementation ValueInputView

@synthesize 
delegate;
@synthesize value 
= _value;
- (void)dealloc {
    [self.value release];
    [super dealloc];
}

- (IBAction)buttonClick:(id)sender
{
    [
delegate passValue:self.value.text];
    NSLog(
@"self.value.text is%@", self.value.text);
    [self dismissModalViewControllerAnimated:YES];    
   
}
- (void)didReceiveMemoryWarning {
    
// Releases the view if it doesn't have a superview.    [super didReceiveMemoryWarning];
    
    
// Release any cached data, images, etc. that aren't in use.}

- (void)viewDidUnload {
    [super viewDidUnload];
    
// Release any retained subviews of the main view.
    
// e.g. self.myOutlet = nil;}

@end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章