NSUserDefaults:更新plist中的数据

时间:2012-11-28 03:42:46

标签: objective-c macos cocoa

我正在使用[NSUserDefaults standardUserDefaults]保存应用偏好设置,其中有几个项目,其中一个是填充字典的数组。我想删除该数组中的第一项,所以我尝试类似:

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

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

[[NSUserDefaults standardUserDefaults] removeObjectForKey:accounts];

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

3 个答案:

答案 0 :(得分: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"]);

答案 1 :(得分:0)

试试这个。

NSMutableArray *Arr=(NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"YourKey"];
[Arr removeObjectAtIndex:0];
[[NSUserDefaults standardUserDefaults] setObject:Arr forKey:@"YourKey"];

答案 2 :(得分:0)

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

//do whatever with [NSUserDefaults standardUserDefaults]
[[NSUserDefaults standardUserDefaults] setBool:randomValue forKey:randomKey];
[[NSUserDefaults standardUserDefaults] synchronize];