iOS设计模式——委托(delegate)
委托(delegate)也叫代理是iOS开发中常用的设计模式。我们借助于protocol(参考博文:objective-c协议(protocol))可以很方便的实现这种设计模式。
view plaincopy
- @interface FirstViewController : UIViewController
在View中添加一个按钮用于触发这个ActionSheet,然后编写这个按钮的响应代码:
[cpp] view plaincopy
- - (IBAction)invokeActionSheet:(id)sender {
- UIActionSheet *actionSheet = [[UIActionSheet alloc]
- initWithTitle:@"Delegate Example"
- delegate:self // telling this class(ViewController) to implement UIActionSheetDelegate
- cancelButtonTitle:@"Cancel"
- destructiveButtonTitle:@"Destruct"
- otherButtonTitles:@"Button 1",@"Button 2",nil];
- [actionSheet showInView:self.tabBarController.view];
- [actionSheet release];
- }
注意,上面有一个很重要的设置就是参数中有个delegate:self,这个设置就是指明了UIActionSheet的代理为self, 也即FirstViewController。
然后在FirstViewController.m中实现UIActionSheetDelegate中的方法:
[cpp] view plaincopy
- #pragma mark --UIActionSheet delegate methods
- - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
- switch (buttonIndex) {
- case 0:
- self.myTextFromActionSheet.text = @"Action Destructed!";
- break;
- case 1:
- self.myTextFromActionSheet.text = @"Action Button 1 Clicked!";
- break;
- case 2:
- self.myTextFromActionSheet.text = @"Action Button 2 Clicked!";
- break;
- case 3:
- self.myTextFromActionSheet.text = @"Cancel Button Clicked!";
- break;
- default:
- break;
- }
- }
上面的几步我们完成了对Cocoa中UIActionSheet已有代理的运用。然而我们很多时候需要自己编写定制的代理,该如何实现呢?
view plaincopy
- @protocol ChangeTextViewDelegate
-
- - (void) textEntered:(NSString*) text;
-
- @end
和UIActionSheet类似,在ChangeTextViewController中我们也需要添加一个代理的声明:
- @property (assign, nonatomic) id
delegate;
3、我们还需要在ChangeTextViewController.xib中添加一个按钮save,当按下这个按钮会返回到second view中,并更新字符串。对save按钮的响应函数为:
[cpp] view plaincopy
- - (IBAction)saveButtonClicked:(id)sender {
- //Is anyone listening
- if([delegate respondsToSelector:@selector(textEntered:)])
- {
- //send the delegate function with the amount entered by the user
- [delegate textEntered:textEntered.text];
- }
- [self dismissModalViewControllerAnimated:YES];
- }
[delegate textEntered:textEntered.text];这句代码的含义就是ChangeTextViewController通知代理,textEntered这个事件发生了,对textEntered这个消息的实现,即如何响应这个textEntered的事件由代理来实现。在本例中,SecondViewController就是ChangeTextViewController对象的代理。所以,我们要对SecondViewController做相应的设置使其满足代理的条件。首先,在SecondViewController.h中声明遵循协议ChangeTextViewDelegate。然后编辑ChangeText按钮的响应函数- (IBAction)changeText:(id)sender;
[cpp] view plaincopy
- - (IBAction)changeText:(id)sender {
- ChangeTextViewController *CTViewController = [[ChangeTextViewController alloc] initWithNibName:@"ChangeTextViewController" bundle:nil];
- //Assign this class to the delegate of ChangeTextViewController,
- //remember to make thie ViewController confirm to protocol "ChangeTextViewDelegate"
- //which is delared in file ChangeTextViewController.h
- CTViewController.delegate = self;
- [self presentModalViewController:CTViewController animated:YES];
- }
注意,CTViewController.delegate = self;这句实现了SecondViewController成为ChangeTextViewController对象的代理。
本文对应的源代码下载:http://download.csdn.net/detail/lovefqing/4874331