2010-08-03 72 views

回答

1

代表是分離消息發送者和接收者的一種方式。消息發佈者不必對#import所有可能對消息感興趣的類的定義,而是定義一個委託類型,並在該委託上調用一個方法來發送消息。接收器類然後實現委託。

1

Wikipedia既有的解釋和例子:)

在軟件工程中,委託模式是一種設計模式 在面向對象編程的地方 的對象,而不是執行一個 其既定任務,將該任務委託給關聯的助手對象。 它通過降壓,所以可以說 (技術上,反轉 責任)。助手對象是 ,稱爲委託。代表 模式是其他軟件模式(如 組合(也稱爲 聚合),mixin和方面)的基本抽象模式之一。

3

Delegate pattern在iPhone SDK中被廣泛使用。考慮下面的例子:

  1. 您正在運行一個動畫。底層系統爲您處理動畫。但是,當動畫結束時(例如,當動畫結束時,您想要激活按鈕或顯示一些文本)時,您想要做某些事情是很自然的。現在動畫系統在動畫結束時如何知道該怎麼做?畢竟這是你的自定義任務。因此,您將爲動畫配置一個委託,系統將在動畫結束時調用該委託方法。顯然你會在這個委託方法中完成你的自定義任務。

  2. 您有一個文本字段,並且您想知道用戶何時在該字段中點擊或編輯了某些內容。你將如何知道?您將爲您的文本字段配置一個委託,預定義的委託方法將在該特定字段被編輯或點擊時由UITextField類調用。

  3. 忘記UIApllicationDelegate?該系統負責加載和運行應用程序。它如何告訴你它的初始化已經完成,你現在可以運行你的代碼?它會調用你的應用程序委託的applicationDidFinishLaunching方法。

  4. 您正在發出異步http請求。加載數據後,您的委託方法將被調用,以便您現在可以處理數據。

還有更多的例子。爲了使用委託,您將需要指定委託對象,有時候還需要指定選擇器。究竟需要做什麼取決於你在做什麼。也就是說,配置動畫委託與配置文本字段委託不同。但是一般的過程是一樣的,那就是你需要指定你的委託對象。動畫

示例代碼:

 
CATransition *animation = [CATransition animation]; 
[animation setDelegate:delegate]; // here delegate is your delegate object 

動畫結束後,您的委託對象的

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
將被調用,你會做你定製這個方法。

0

基本定義: 委託是行爲代表的,或與另一對象的協調時該對象遇到在一個程序中的事件的對象。 more details

情形(在消息傳遞中使用): 假設對象A呼叫對象B執行動作。一旦行動完成,對象A應該知道B已經完成了任務並採取了必要的行動。這是代表團的工作原理。

藉助協議,我們可以在iOS中實現委派。這裏是 代碼:

ViewControllerA.h

#import <UIKit/UIKit.h> 

@interface ViewControllerA : UIViewController 
{ 

} 
@end 

ViewControllerA.m

#import "ViewControllerA.h" 
#import "ViewControllerB.h" 

@interface ViewControllerA()<SimpleProtocol> 

@end 

@implementation ViewControllerA 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [self performSelector:@selector(delegatingWorkToControllerB)withObject:nil afterDelay:3.0]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


-(void)delegatingWorkToControllerB{ 
    ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerB"]; 
    vcB.delegate = self; 
    [self presentViewController:vcB animated:YES completion:^{ 

    }]; 
} 


#pragma mark - SimpleProtocol Delegate Method 

-(void)updateStatus:(NSString*)status { 
    NSLog(@"%@",status); 
} 

@end 

ViewControllerB.h

#import <UIKit/UIKit.h> 

@protocol SimpleProtocol<NSObject> 

-(void)updateStatus:(NSString*)status; 

@end 

@interface ViewControllerB : UIViewController 
{ 

} 
@property(nonatomic, unsafe_unretained)id<SimpleProtocol>delegate; 

@end 

ViewControllerB.m

#import "ViewControllerB.h" 

@interface ViewControllerB() 

@end 

@implementation ViewControllerB 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [self performSelector:@selector(informingControllerAAfterCompletingWork) withObject:nil afterDelay:3.0]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
} 


-(void)informingControllerAAfterCompletingWork{ 
    //you can perform some task here and after completion of the task you can call this to notify the previous controller 

    [self.delegate updateStatus:@"controller B work has done.. update successfull :)"]; 

    //dismissing the view controller 
    [self dismissViewControllerAnimated:YES completion:^{ 

    }]; 
} 

@end 

工作示例:code