0

を使用してアプリの設定を保存し[NSUserDefaults standardUserDefaults]ています。その中にいくつかの項目があり、そのうちの 1 つは辞書で満たされた配列です。その配列の最初の項目を削除したいので、次のようにします。

[[[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

配列の開始を回避することがわかった別の解決策を次に示します。

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

これを試して。

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