代理(delegate)是iOS开发中常用的设计模式。我们借助于protocol可以很方便的实现这种设计模式。
代理官方文档解释:
代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象和程序中其他的对象进行交互。 主对象(这里指的是delegating object)中维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息。这个消息通知“代理”主对象即将处理或是已经处理完了某一个事件。这个代理可以通过更新自己或是其它对象的UI界面或是其它状态来响应主对象所发送过来的这个事件的消息。或是在某些情况下能返回一个值来影响其它即将发生的事件该如何来处理。代理的主要价值是它可以让你容易的定制各种对象的行为。注意这里的代理是个名词,它本身是一个对象,这个对象是专门代表被代理对象来和程序中其他对象打交道的。
一、框架中代理的使用
1、在UI控件中声明一个类型为id的delegate或是dataSource
@interface AppView ()<UIActionSheetDelegate>
2、调用该类型的代理方法,触发ActionSheet,然后编写这个按钮的响应代码
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
}
二、自定义代理
1、模型类中自定义代理
#import <UIKit/UIKit.h>
@class AddVC,Contact;
//定义代理协议
@protocol AddContactVCDelegate <NSObject>
@optional//必须使用的代理方法
//方法名:名字+代理功能+所需传递的数据
-(void)addContactViewController:(AddVC *)addContactVc didSaveContact:(Contact *)contact;
@end
@interface AddVC : UIViewController
//定义代理属性
@property(nonatomic,weak)id<AddContactVCDelegate> delegate;
@end
2、模型类中进行调用
- (IBAction)save:(id)sender {
//判断对象是否实现了代理方法
if([self.delegate respondsToSelector:@selector(addContactViewController:didSaveContact:)]){
//传递数据
Contact *contact = [[Contact alloc] init];
contact.name = self.nameLabel.text;
contact.tel = self.telLabel.text;
//调用代理方法,给代理发送信息
[self.delegate addContactViewController:self didSaveContact:contact];
}
}
3、让代理类遵守代理协议
@interface ContactVC ()<AddContactVCDelegate>
4、在代理类中实现代理方法
-(void)addContactViewController:(AddVC *)addContactVc didSaveContact:(Contact *)contact{
//以下内容为参考
//把模型添加到联系人数组
[self.contacts addObject:contact];
//局部刷新
NSIndexPath *lastPath = [NSIndexPath indexPathForItem:self.contacts.count-1 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[lastPath] withRowAnimation:UITableViewRowAnimationFade];
//隐藏控制器
[self.navigationController popViewControllerAnimated:YES];
//同步新数据到沙盒
[NSKeyedArchiver archiveRootObject:self.contacts toFile:self.contactPath];
}