IOS-Protocol和Delegate
介绍
Protocol(协议),简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现。和Java语言中的接口很类似。
Delegate(委托)模式把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。委托模式在IOS中经常会使用到的模式,如UITableViewDataSource,UITableViewDelegate。在IOS中使用Protocol来实现实现委托模式。
Protocol(协议)
声明协议:
Protocol代码可以单独放在一个h文件中,也可以写在相关类的h文件中,可以视具体情况而定。
@protocol ProcessDataDelegate
-(void)methodA;
@required
- (void) processSuccessful: (BOOL)success;
@optional
- (id) submitOrder: (NSNumber *) orderid;
@end
- @required:表示该方法必须被实现。
- @optional:表示该方法可选择实现。
默认情况下,在Protocol中定义的方法都是@required的。
协议继承
Protocol本身是可以继承的
@protocol A
-(void)methodA;
@end
@protocol B < A >
-(void)methodB;
@end
如果你要实现B,那么methodA和methodB都需要实现。
协议实现
如果实现Protocol,需要在类的h文件中引入包含Protocol的h文件,之后声明实现这个Protocol即可,如下面代码所示,用尖括号(<...>)括起来的就是我们实现的Protocol。如果要实现多个Protocol,可以在尖括号内引入多个Protocol名称,并用逗号隔开即可。
@interface SettingViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
@end
如果要判断类是否实现了某个协议,使用下面的代码即可
[obj conformsToProtocol:@protocol(ProcessDataDelegate)]
Delegate(委托)
场景说明:A界面跳转到B界面,在B界面操作后,往A界面传值。
A界面的实现类为ImNewViewController,B界面的实现类为PersionsViewController。在PersionsViewController中声明协议,在ImNewViewController中实现协议的方法,然后指定委托对象为自己。PersionsViewController中调用协议的委托对象实现的方法,实现传值。
声明委托
在PersionsViewController.h文件中声明了PersionsViewControllerDelegate协议,并且定义了一个PersionsViewControllerDelegate的委托对象。
@protocol PersionsViewControllerDelegate <NSObject>
//选择收件人后回调的方法
-(void)complete:(NSMutableDictionary*)checkedDictionary;
@end
@interface PersionsViewController :BaseViewController<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate>{
}
@property(nonatomic,weak) id<PersionsViewControllerDelegate> delegate;
@end
实现委托
在ImNewViewController.h文件中声明实现PersionsViewControllerDelegate委托协议。
@interface ImNewViewController : BaseViewController<PersionsViewControllerDelegate>{
}
在ImNewViewController.m文件中指定委托对象
PersionsViewController *nextController=[[PersionsViewController alloc] init];
nextController.delegate=self;
[self.navigationController pushViewController:nextController animated:YES];
在ImNewViewController.m文件中实现PersionsViewControllerDelegate委托协议中定义的方法。
#pragma mark PersionsViewControllerDelegate Source
-(void)complete:(NSMutableDictionary*)dictionary{
...
}
委托调用
在PersionsViewController.m文件中调用委托对象的方法。
if([self.delegate respondsToSelector:@selector(complete:)]){
[self.delegate complete:self.checkedDictionary];
}
- (BOOL)respondsToSelector:(SEL)aSelector:这个方法是判断委托对象中是否实现了aSelector方法。