一般情況下是這樣的,例如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