将NSMutableDictionary保存到NSUserDefaults

时间:2014-01-14 03:11:13

标签: ios nsuserdefaults

在我的应用程序中,我保存的一件事就是一组开关的价值。我们的想法是将每个开关的状态保存在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'

令人困惑的是,它正在吐出正确的值,但仍然抛出异常。我必须做一些非常错误的事情。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

如果您需要将其保存到NSUserDefaults或plist,则所有键必须是字符串。你的钥匙是数字。

答案 1 :(得分:0)

要将对象保存为用户默认值,您的对象必须是有效的属性列表对象。 如果要检查哪些对象是有效的属性列表对象,只需创建一个新的plist文件并使用它播放一段时间,添加一些条目,您将看到哪些类型已经处理/可用于保存而无需任何先前的预处理读/写它们。 乍一看,您的值似乎是布尔值和字符串/ nsnumbers键,它们是有效的。 我建议打印出对象的类,并检查它们是否真的有效。 您可以在此处获取更多信息 https://developer.apple.com/library/ios/documentation/cocoa/conceptual/PropertyLists/Introduction/Introduction.html