iOS开发 ----- Controller之间的传值

来源:互联网 发布:november rain 知乎 编辑:程序博客网 时间:2024/05/18 18:15

Controller之间的传值

属性传值

A->B传值,在push之前,给B的对象的属性赋值即可,相对简单但这样的话B->A无法传值

单例传值

单例的话,每次实例化一个对象都是时原来的,所以不会改变这个方法借助第三方类,不管是A->B 还是B->A 之间的传值都可以实现

block传值

1.A->B的传值    正向传值     流程        1.在B里生命一个block,然后在init的时候把block要做的事情写好        2.在push之前,调用 b.block();把值传过去即可        其实这里的的block也用到了属性,毕竟在push之前调用,要把值保存下来,所以正向传值的时候并没有什么优势    反向传值    流程        1.在A里声明block,写好要做的事        2.在B里声明block        3.在push之前,把A的block赋值给B的block        4.在B->A的时候,也就是pop之前,b.block();即可        这里反向从B中操作了A,为了避免强引用造成的内存泄露,所以在A的block中,把self变为week        __week AController * controller = self;

代理传值

代理传值一般用来反向传值即从A->B之后,B传值给A    流程    1.在B里声明一个协议,写好实现方法func    2.在B里声明一个遵守这个协议的代理    3.在A里遵守这个协议,并实现协议的方法func    4.在A里,A->B push之前设置B的代理为A    5.在B里,pop之前,[]self.delegate func()];

通知中心传值

正反都可以,原理是一样的,通知中心是一个单例,每个APP只有一个通知中心,类似于电台,但一个通知中心可以有多个频道,每个频道传递不同的数据,每个controller都可以监听信息,获取对自己有用的信息,然后通过view展示简单的说就是, 谁要传值,谁就建立一个频道,写入自己要传递的信息            谁要接受,谁就去监听这个频道,获取值之后,做自己想做的事情在B->A 也就是pop之前 建立一个名叫changeColor的频道,里边传递的内容时blue    [[NSNotificationCenter defaultCenter] postNotificationName:@"changeColor" object:@"blue"];在A->B 之前,可以在viewWillAppera中,声明监听电台的方法当可以从电台changeColor收到消失的时候,就会调用changeColorFunc这个方法    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeColorFunc:) name:@"changeColor" object:nil];这里可以直接通过notif拿到频道传递的数据-(void)changeColorFunc:(NSNotification *)notif{    //这里会存储广播信息    NSString * str = notif.object;    //notif.userInfo 一个字典,objectForKey 取到相关数据    //对应post方法 中的userInfo    if ([str isEqualToString:@"blue"]) {        self.view.backgroundColor = [UIColor blueColor];    }}
0 0