以下是我总结的协议传值封装的方法。
问题:如果A页面跳转B,B需要回传值至A页面,怎么回传?
当然,回传有很多方式,诸如协议,通知,Block,AppDelegate等等。但协议是最安全,也是最符合面向对象语言风格的一种值回传方式。
一般协议回传的做法是在B类的.h文件中声明协议和协议方法(1),然后声明协议属性(2),在B中的.m中调用协议方法(3)。
再回到A类中遵守协议(4),A页面跳转B页面时,将协议对象设置成自己self(5),最后引入协议方法(6)达到回传的目的。
是不是很麻烦?确实太麻烦了,6个步骤,如果每次回传值都这么写,累觉不爱啊!
其实我们可以这么做,下面看下如何封装协议传值吧!
1.建立SelectProtocal的.h文件(只需要创建Header File)
如下:
#import
@protocolSelectProtocal
@optional
- (void)didSelectedList:(NSMutableArray*)array type:(NSString*)type;//可传递一个数组
- (void)didSelectedSingle:(id)item type:(NSString*)type;//可传递一个对象
@end
2.在B类中:
.h中引入协议头文件
#import"SelectProtocal.h"
声明协议属性
@property(nonatomic,weak)__weak id delegate;
在.m合适的地方传递
if(self.delegate&&[self.delegaterespondsToSelector:@selector(didSelectedList:type:)]){
[self.delegate didSelectedList:array type:@"Btype"];
[self.navigationControllerpopViewControllerAnimated:YES];//跳转回A类
}
注:
self.delegaterespondsToSelector:@selector(didSelectedList:type:):协议中的方法,如果是要传递一个对象,则用另外一个方法
array:你要传递的数组
Btype:你要传值的类型,名字随便取,用于标注,在接收值的地方会用到,此参数非常重要,必须是唯一的
3.到A类中
遵守协议:
<SelectProtocal>
设置代理:
BViewController *ctrl = [BViewController new];//在A类跳转B类处
ctrl.delegate=self;
4.在A类中实现协议方法:
- (void)didSelectedList:(NSMutableArray*)array type:(NSString*)type{
if([typeisEqualToString:@"Btype"]) {
注:这里用到了B类中的标识符Btype,这个标识符必须唯一,因为会在其他类中复用到这个协议方法,如果标识符冲突就会有问题。
在这里我们就能取到从B类中传递过来的数组array,如果是对象同理调用另外一个协议方法传递。
}
这样如果你明白了,下次就可省去了声明协议方法的时间了。