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

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];
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章