您的位置:首页 > 移动开发 > IOS开发

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

2015-09-22 19:52 363 查看

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: