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

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