iOS设计模式——委托(delegate)


委托(delegate)也叫代理是iOS开发中常用的设计模式。我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式。

view plaincopy
  1. @interface FirstViewController : UIViewController   

 

在View中添加一个按钮用于触发这个ActionSheet,然后编写这个按钮的响应代码:

 

[cpp] view plaincopy
  1. - (IBAction)invokeActionSheet:(id)sender {  
  2.       
  3.     UIActionSheet *actionSheet = [[UIActionSheet alloc]  
  4.                                   initWithTitle:@"Delegate Example"  
  5.                                   delegate:self // telling this class(ViewController) to implement UIActionSheetDelegate  
  6.                                   cancelButtonTitle:@"Cancel"  
  7.                                   destructiveButtonTitle:@"Destruct"  
  8.                                   otherButtonTitles:@"Button 1",@"Button 2",nil];  
  9.       
  10.     [actionSheet showInView:self.tabBarController.view];  
  11.     [actionSheet release];  
  12. }  


注意,上面有一个很重要的设置就是参数中有个delegate:self,这个设置就是指明了UIActionSheet的代理为self, 也即FirstViewController。


然后在FirstViewController.m中实现UIActionSheetDelegate中的方法:

 

[cpp] view plaincopy
  1. #pragma mark --UIActionSheet delegate methods  
  2. - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {  
  3.     switch (buttonIndex) {  
  4.         case 0:  
  5.             self.myTextFromActionSheet.text = @"Action Destructed!";  
  6.             break;  
  7.         case 1:  
  8.             self.myTextFromActionSheet.text = @"Action Button 1 Clicked!";  
  9.             break;  
  10.         case 2:  
  11.             self.myTextFromActionSheet.text = @"Action Button 2 Clicked!";  
  12.             break;  
  13.         case 3:  
  14.             self.myTextFromActionSheet.text = @"Cancel Button Clicked!";  
  15.             break;  
  16.         default:  
  17.             break;  
  18.     }  
  19.       
  20. }  

上面的几步我们完成了对Cocoa中UIActionSheet已有代理的运用。然而我们很多时候需要自己编写定制的代理,该如何实现呢?

view plaincopy
  1. @protocol ChangeTextViewDelegate   
  2.   
  3. - (void) textEntered:(NSString*) text;  
  4.   
  5. @end  


和UIActionSheet类似,在ChangeTextViewController中我们也需要添加一个代理的声明:

[cpp] view plaincopy
  1. @property (assign, nonatomic) id delegate;  

 

3、我们还需要在ChangeTextViewController.xib中添加一个按钮save,当按下这个按钮会返回到second view中,并更新字符串。对save按钮的响应函数为:

 

[cpp] view plaincopy
  1. - (IBAction)saveButtonClicked:(id)sender {  
  2.     //Is anyone listening  
  3.     if([delegate respondsToSelector:@selector(textEntered:)])  
  4.     {  
  5.         //send the delegate function with the amount entered by the user  
  6.         [delegate textEntered:textEntered.text];  
  7.     }  
  8.       
  9.     [self dismissModalViewControllerAnimated:YES];  
  10. }  

 

[delegate textEntered:textEntered.text];这句代码的含义就是ChangeTextViewController通知代理,textEntered这个事件发生了,对textEntered这个消息的实现,即如何响应这个textEntered的事件由代理来实现。在本例中,SecondViewController就是ChangeTextViewController对象的代理。所以,我们要对SecondViewController做相应的设置使其满足代理的条件。首先,在SecondViewController.h中声明遵循协议ChangeTextViewDelegate。然后编辑ChangeText按钮的响应函数- (IBAction)changeText:(id)sender;

 

[cpp] view plaincopy
  1. - (IBAction)changeText:(id)sender {  
  2.     ChangeTextViewController *CTViewController = [[ChangeTextViewController alloc] initWithNibName:@"ChangeTextViewController" bundle:nil];  
  3.     //Assign this class to the delegate of ChangeTextViewController,  
  4.     //remember to make thie ViewController confirm to protocol "ChangeTextViewDelegate"  
  5.     //which is delared in file ChangeTextViewController.h  
  6.     CTViewController.delegate = self;  
  7.     [self presentModalViewController:CTViewController animated:YES];  
  8. }  


注意,CTViewController.delegate = self;这句实现了SecondViewController成为ChangeTextViewController对象的代理。

本文对应的源代码下载:http://download.csdn.net/detail/lovefqing/4874331

相关