iOS协议传值封装总结

作者: handsome丶亮 | 来源:发表于2016-03-19 17:43 被阅读368次

    大家好,我是亮亮,这是我总结的协议传值封装的方法。

    问题:如果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,如果是对象同理调用另外一个协议方法传递。

    }

    这样如果你明白了,下次就可省去了声明协议方法的时间了。

    相关文章

      网友评论

      本文标题:iOS协议传值封装总结

      本文链接:https://www.haomeiwen.com/subject/ijmhlttx.html