在我的应用程序中,我保存的一件事就是一组开关的价值。我们的想法是将每个开关的状态保存在NSMutableDictionary中。在另一种方法中,我读出每个开关的值(“状态”)并使用它来执行简单的计算。这些开关基本上告诉我用户的用途。
在我的数据模型中。
-(void)savePlates:(NSMutableDictionary *)settingPlates {
[self setObject:settingPlates forKey:@"plates"];
[self synchronize];
}
-(NSMutableArray *)loadPlates {
NSMutableArray *plates = [[self dictionaryForKey:@"plates"] mutableCopy];
return plates;
}
在View Controller中使用它的示例。其中'settings'是定义上述方法的类的实例。
-(IBAction)switch55:(id)sender {
if (self.switch55.on) {
[self.plateSelectionDict setObject:@YES forKey:@55];
} else {
[self.plateSelectionDict setObject:@NO forKey:@55];
}
[settings savePlates:self.plateSelectionDict];
if (DEBUG) {
NSLog(@"%@", self.plateSelectionDict);
}
}
我在这条线上崩溃了。 [self setObject:settingPlates forKey:@“plates”];
错误是,
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'*** -[Settings setObject:forKey:]: attempt to insert non-property list object {
55 = 0;
25 = 1;
"0.25" = 1;
"0.5" = 1;
"0.75" = 1;
45 = 1;
15 = 0;
1 = 1;
10 = 1;
"2.5" = 1;
35 = 1;
5 = 1;
} for key plates'
令人困惑的是,它正在吐出正确的值,但仍然抛出异常。我必须做一些非常错误的事情。任何帮助将不胜感激。
答案 0 :(得分:3)
如果您需要将其保存到NSUserDefaults或plist,则所有键必须是字符串。你的钥匙是数字。
答案 1 :(得分:0)
要将对象保存为用户默认值,您的对象必须是有效的属性列表对象。 如果要检查哪些对象是有效的属性列表对象,只需创建一个新的plist文件并使用它播放一段时间,添加一些条目,您将看到哪些类型已经处理/可用于保存而无需任何先前的预处理读/写它们。 乍一看,您的值似乎是布尔值和字符串/ nsnumbers键,它们是有效的。 我建议打印出对象的类,并检查它们是否真的有效。 您可以在此处获取更多信息 https://developer.apple.com/library/ios/documentation/cocoa/conceptual/PropertyLists/Introduction/Introduction.html