VC之间数据传值有多种方法,比如代理,消息,appdelegate保存全局变量,或者使用DB/NSDefault保存变量等,我们下面详细介绍几种方式。
1.正向传值
场景:从level1ViewController传值到level2ViewController,not vice versa
方法:利用属性传值即可
DayActivityVC *dayActivityVC = [[DayActivityVC alloc]init];
[dayActivityVC setDayId:self.id];
[self.navigationController pushViewController:dayActivityVC animated:YES];
总结:这种方式,只是简单的将数据从VC1传递到了VC2,然后互不干扰。
2.双向沟通
场景:level1ViewController创建了level2ViewController,她们之间有些共享数据,两者同时可以读写,但是需要互相通知。
方法:可以使用正向传值将值传递给level2ViewController,然后通过delegate方式将VC2的更改通知level1ViewController,但是这种耦合度较高,推荐Model方式。
dataModel dm = [dataModel alloc] initWithData: shareData];
[[level2ViewController alloc] init];
[level2ViewController setProp_1];
[level2ViewController setModel: dm];
[level1ViewController. navigationController pushViewController:level2ViewController];
总结:当level2ViewController修改了shareData不需要通知level1ViewController,shareData会通知她的controllers的。
3.反向传值
场景:基本操作都还是前面描述的1或2中的情形,区别点在于,在level2ViewController的生命期内,发生了某个事件,需要让level1ViewController知道这个事件,并且作出对应的处理。
方法:
总结:但是!一定要谨慎使用这种方案。如果发现代码中需要用到这种结构,首先应该重新审视项目的架构,看能不能用前面两种方案来处理,可能需要做一定的代码重构。当前面的方案实在是无能为力的时候,才考虑使用此方案。而且,尽量让这种逆向的消息传递更简单,消息事件不要太多。
4.大量消息的双向沟通
如果你的代码中有大量的消息双向沟通,你需要重新审视代码,将view合并到一起
5.利用block
http://www.tuicool.com/articles/UfUJVn
6.利用notification
http://www.th7.cn/Program/IOS/201410/302577.shtml
http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers
http://blog.csdn.net/ryantang03/article/details/7915045