3

で保存しようとしてNSMutableDictionaryNSUserDefaultsます。私はstackoverflowのトピックに関する多くの投稿を読みました...私はまた、うまくいった1つのオプションを見つけました。ただし、残念ながら、それは1回だけ機能し、その後は保存(null)のみを開始しました。誰かヒントがありますか?

ありがとう

保存するコード:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:dictionary] forKey:@"Key"];
[[NSUserDefaults standardUserDefaults] synchronize];

ロードするコード:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]init];
NSData *data = [[NSUserDefaults standardUserDefaults]objectForKey:@"Key"];
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSMutableDictionaryオブジェクトを:に追加するコード

[dictionary setObject:[NSNumber numberWithInt:0] forKey:@"Key 1"];
[dictionary setObject:[NSNumber numberWithInt:1] forKey:@"Key 2"];
[dictionary setObject:[NSNumber numberWithInt:2] forKey:@"Key 3"];

NSLog()値へのコード:

for (NSString * key in [dictionary allKeys]) {
    NSLog(@"key: %@, value: %i", key, [[dictionary objectForKey:key]integerValue]);
}

また、キーは(null)です:

NSLog(@"%@"[dictionary allKeys]);
4

1 に答える 1

10

のAppleのドキュメントからNSUserDefaults objectForKey:最初に設定した値が変更可能だったとしても、
返されるオブジェクトは不変です。

この線:

dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

以前に作成された を破棄し、NSMutableDictionaryを返しますNSDictionary

ローディングを次のように変更します。

NSData *data = [[NSUserDefaults standardUserDefaults]objectForKey:@"Key"];
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSKeyedArchiver完全な例。この例でも使用する必要はありません。

NSDictionary *firstDictionary = @{@"Key 4":@4};
[[NSUserDefaults standardUserDefaults] setObject:firstDictionary forKey:@"Key"];

NSMutableDictionary *dictionary = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Key"] mutableCopy];

dictionary[@"Key 1"] = @0;
dictionary[@"Key 2"] = @1;
dictionary[@"Key 3"] = @2;

for (NSString * key in [dictionary allKeys]) {
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]);
}

NSLog 出力:
キー: キー 2、値: 1
キー: キー 1、値: 0
キー: キー 4、値: 4
キー: キー 3、値: 2

于 2012-12-31T19:35:47.540 に答える