【问题标题】:Saving custom class object's array in NSUserDefaults?在 NSUserDefaults 中保存自定义类对象的数组?
【发布时间】:2013-11-17 15:46:23
【问题描述】:

我创建了一个自定义类以在 TableView 中显示,我在 TableView 中读取了一个自定义类对象的数组。现在,当我关闭应用程序时,我失去了约会。我想永久保存该数据。但是当我尝试这样做时,我收到以下错误:

Attempt to set a non-property-list object as an NSUserDefaults

我的代码是:

@implementation CAChallangeListViewController
- (void)loadInitialData{
    self.challangeItems = [[NSUserDefaults standardUserDefaults] objectForKey:@"challanges"];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[NSUserDefaults standardUserDefaults] setObject:self.challangeItems forKey:@"challanges"];
}

在这里,自我。挑战项目是一个 NSMutable 数组,其中包含 CAChallange 类型的对象,这是一个具有以下接口的自定义类。

@interface CAChallange : NSObject
    @property NSString *itemName;
    @property BOOL *completed;
    @property (readonly) NSDate *creationDate;
@end

【问题讨论】:

标签: ios nsuserdefaults


【解决方案1】:

您可以通过将对象转换为标准字典(并在需要阅读时返回)轻松完成您正在做的事情。

NSMutableArray *itemsToSave = [NSMutableArray array];
for (CAChallange *ch in myTableItems) {
   [itemsToSave addObject:@{ @"itemName"     : ch.itemName,
                             @"completed"    : @(ch.completed),
                             @"creationDate" : ch.creationDate }];
}

【讨论】:

  • 您在示例中循环了一个空数组
  • 很好,谢谢。我需要另一个描述原始数据源的变量。
【解决方案2】:

您可以使用NSKeyedArchiver 创建对象的NSData 表示。您的类需要符合NSCoding 协议,这可能有点乏味,但AutoCoding 类别可以为您完成这项工作。将其添加到您的项目后,您可以像这样轻松地序列化您的对象:

id customObject = // Your object to persist
NSData *customObjectData = [NSKeyedArchiver archivedDataWithRootObject:customObject];
[[NSUserDefaults standardUserDefaults] setObject:customObjectData forKey:@"PersistenDataKey"];

然后像这样反序列化它:

NSData *customObjectData = [[NSUserDefaults standardUserDefaults] objectForKey:@"PersistenDataKey"];
id customObject = [NSKeyedUnarchiver unarchiveObjectWithData:customObjectData];

【讨论】:

    【解决方案3】:

    您的CAChallange 对象有一个指向不适合 plist 的类型的 BOOL 的指针:-

     @property BOOL *completed
    

    这可能是导致错误的原因。您不能将原始指针存储在 plist 中。

    【讨论】:

    • 我认为它是编译器对象的CAChallange 类型。布尔值可以作为 NSUserDefaults。
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多