一般情况下是这样的,例如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.使用SharedApplication,定义一个变量来传递.
2.使用文件,或者NSUserdefault来传递
3.通过一个单例的class来传递
4.通过Delegate来传递。
前面3种方法,暂且不说,这次主要学习如何使用通过Delegate的方法来在不同的UIView里传递数据 。
比如: 在窗口1中打开窗口2,然后在窗口2中填入一个数字,这个数字又回传给窗口1。
窗口1
窗口2
窗口1的数据传给窗口2
有一个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了。
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
@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