【问题标题】:How to archive an object in one View Controller and then unarchive it in another?如何在一个视图控制器中归档对象,然后在另一个视图控制器中取消归档?
【发布时间】:2014-03-22 18:32:36
【问题描述】:

我有一个对象“School”,它有一个可变数组属性“favoritesArray”和一个 NSString 属性“name”。

我有 2 个视图控制器“HomeViewController”和“FavoritesTableViewController”。

在我的 HomeViewController 中,当点击按钮时会调用此方法:

self.school=[[School alloc]init]; 
[self.school.favoritesArray addObject:self.school.name];
 NSData *schoolData=[NSKeyedArchiver archivedDataWithRootObject:self.school];
[[NSUserDefaults standardUserDefaults] setObject:schoolData forKey:@"schoolData"];

然后在我的“FavoritesTableViewController”中,我尝试取消归档以前归档的“学校”对象,以便访问“favoritesArray”。

当在我的“FavoritesTableViewController”中点击按钮时,会调用此方法:

NSData *dataRetrieved=[[NSUserDefaults standardUserDefaults] objectForKey:@"schoolData"];
School *schoolTwo=[NSKeyedUnarchiver unarchiveObjectWithData:dataRetrieved];
NSLog(@"%lu", (unsigned long)schoolTwo.favoritesArray.count);

但是它记录 0 意味着它没有取消存档在“HomeViewController”中存档的对象。

如何取消归档在单独视图控制器中的对象?

【问题讨论】:

  • 如果完全相同的代码可以在同一个 ViewController 上运行,那肯定还有别的,你能展示一下你的“School”类的代码吗?
  • @rivtracks 你有什么解决办法吗,我也遇到了同样的问题。

标签: ios objective-c nskeyedarchiver nskeyedunarchiver


【解决方案1】:

School必须为NSKeyedArchiver实现NSCoding才能序列化它。

有关 NSCoding 和 NSKeyedArchiver 的详细介绍,请参阅 http://nshipster.com/nscoding/。

【讨论】:

  • 如果它没有实现 NSCoding 它将抛出一个异常,而不是登录一个零计数!
  • 我确实实现了 NSCoding。当我在同一个视图控制器上取消归档它时,它可以完美地工作。
  • 对我来说,它应该可以工作。当您在同一个视图控制器中反序列化时,也许您看到的是同一个对象?你能告诉我们学校的 init、initWithCoder 和 encodeWithCoder 方法吗?
【解决方案2】:

不管你做什么都是对的,我想你忘了初始化可变数组。

self.school=[[School alloc]init];
self.school.favoritesArray = [NSMutableArray array];
[self.school.favoritesArray addObject:self.school.name];

【讨论】:

  • 对我来说,这应该在 School init 方法中完成。
【解决方案3】:

在您的学校NSObject 中,您已经实现了NSCoding 协议,您是否对其中的所有对象进行了编码?这样做是必要的,因为您正在尝试归档 School 对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多