我创建了一个在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"];
}
在这里,自我。 Challange项是一个NSMutable数组,它包含CAChallange类型的对象,这是一个具有以下接口的自定义类。
@interface CAChallange : NSObject
@property NSString *itemName;
@property BOOL *completed;
@property (readonly) NSDate *creationDate;
@end
答案 0 :(得分:3)
您可以通过将对象转换为标准字典(以及需要阅读时将其返回)轻松完成您正在执行的操作。
NSMutableArray *itemsToSave = [NSMutableArray array];
for (CAChallange *ch in myTableItems) {
[itemsToSave addObject:@{ @"itemName" : ch.itemName,
@"completed" : @(ch.completed),
@"creationDate" : ch.creationDate }];
}
答案 1 :(得分:1)
您可以使用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];
答案 2 :(得分:0)
你的CAChallange
对象有一个指向BOOL的指针,它不适合plist: -
@property BOOL *completed
这可能导致错误。您不能将原始指针存储在plist中。