0

我正在使用 保存应用程序首选项[NSUserDefaults standardUserDefaults],其中有一些项目,其中一个是一个充满字典的数组。我想删除该数组中的第一项,所以我尝试类似:

[[[NSUserDefaults standardUserDefaults] objectForKey:accounts] removeObjectAtIndex:0];

这确实会删除索引 0 处的数组项,但不会更新 plist 文件。但是,当我这样做时

[[NSUserDefaults standardUserDefaults] removeObjectForKey:accounts];

它删除所有项目并更新 plist 文件。为什么第一行不将数据保存到plist?

4

3 回答 3

3

文档指出从返回的值NSUserDefaults是不可变的。我认为这意味着如果您检索一个值(objectForKey:例如通过),然后修改该值,则更改不会保留回用户默认值。您需要自己通过setObject:forKey:.

来自https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

从 NSUserDefaults 返回的值是不可变的,即使您将可变对象设置为值。例如,如果您将可变字符串设置为“MyStringDefault”的值,那么您稍后使用 stringForKey: 检索的字符串将是不可变的。

虽然这真的很奇怪,但以下似乎可行......(但不会持续改变)。

  [[NSUserDefaults standardUserDefaults] setObject:@[@{@"hello" : @"1234"}, @{@"bye" : @"aoeu"}] forKey:@"accounts"];
  // Outputs both dictionaries
  NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"accounts"]);
  [[[NSUserDefaults standardUserDefaults] objectForKey:@"accounts"] removeObjectAtIndex:0];
  // Outputs only 1 dictionary
  NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"accounts"]);
于 2012-11-28T04:00:45.097 回答
0

试试这个。

NSMutableArray *Arr=(NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"YourKey"];
[Arr removeObjectAtIndex:0];
[[NSUserDefaults standardUserDefaults] setObject:Arr forKey:@"YourKey"];
于 2012-11-28T05:46:00.723 回答
0

这是我发现的另一个解决方案,可以避免启动数组:

//do whatever with [NSUserDefaults standardUserDefaults]
[[NSUserDefaults standardUserDefaults] setBool:randomValue forKey:randomKey];
[[NSUserDefaults standardUserDefaults] synchronize];
于 2012-12-07T17:04:17.077 回答