iOS 不同界面(ViewController)之间传值

今天遇到一个问题:如何在多个viewController 之间进行传值,我有A、B、C三个 view,三个 view 均在同一 Navigation Controller 容器中,关系如下图:

iOS 不同界面(ViewController)之间传值_第1张图片


在 AB 或 BC 之间传值较为熟悉,可以选择的方式有:delegate, block, 属性设置 等。但A到C之间传值之前没有实现过,查资料后找到几种选择:1.userDefault 或文件的方式 2.notification的方式 3.单例模式 (KVO、KVC没有仔细研究实现方式)

选择单例模式的话感觉会增加数据模型的复杂性,暂时没选择;notification的方式昨天尝试了一下,但app会crash而且没有错误提示;最后尝试通过userDefault 的方式成功实现。

在C类.m文件中popViewController 或其他地方添加以下代码:

NSData *encodedObj = [NSKeyedArchiver archivedDataWithRootObject:obj]; //obj为要传递的对象
  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  [defaults setObject:encodedObj forKey:@"obj"];

    在A类 NavigationControllerDelegate 代理方法中解归档数据 

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *objData = [defaults objectForKey:@"obj"];
    OBJ *obj = [NSKeyedUnarchiver unarchiveObjectWithData:objData];
}

1.上面之所以要先将自定义类的对象obj进行归档是因为 NSUserDefault 只能保存NSArrayNSDictionaryNSStringNSDataNSNumber, 和 NSDate ;因此自定义类要实现NSCoding协议,但只实现协议,直接使用[defaults setObjcect:obj forKey:@"obj"]会导致crash。

2.因为我只要数据对象从 C 到 A 传递一次,所以在 A 得到 C 中的 objcect 之后立即删除了 userDefaults 中的对象,减少错误的可能性。

3.其他方式还没有试或没有实现,如果您有好的方法,烦请指点。


参考文章:

1.Attempt to set a non-property-list object as an NSUserDefaults [点击打开链接]

2.NSUserDefaults读取和写入自定义对象 [点击打开链接]

3.删除UserDefault里某个object致app crash的解决过程[点击打开链接]

4.How to PASS data using CORE DATA among THREE ViewControllers on iOS 7点击打开链接

5. ViewController之间如何传值 [点击打开链接]
6.iOS开发系列-视图切换[点击打开链接]

7.iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)[点击打开链接]


你可能感兴趣的:(iOS,OC)