2012-12-31 84 views
3

我正試圖用NSUserDefaults保存NSMutableDictionary。我在stackoverflow上閱讀了很多關於這個主題的文章...我也發現了一個可以工作的選項;然而不幸的是,它只工作了一次,然後它開始只保存(空)。 有人有提示嗎?爲什麼NSUserDefaults無法保存NSMutableDictionary?

由於

代碼來保存:

[[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的( )值S:

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

而且還鍵(空):

NSLog(@"%@"[dictionary allKeys]); 
+0

真的很好提出的問題! – zaph

回答

10

從蘋果公司的文檔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
key:Key 1,value:0
key:Key 4,value:4
key:Key 3,va lue:2

+1

新年快樂Zaph: 非常感謝您的幫助。我終於成功地使其工作(通過[NSKeyedArchiver archiveRootObject:counts toFile:path];/[NSKeyedUnarchiver unarchiveObjectWithFile:path])。 Neverthless我對你的答案有一個問題,因爲我無法使它與NSUserDefaults一起工作。您建議將加載更改爲: NSData * data = [[NSUserDefault standardUserDefaults] objectForKey:@「Key」]; dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 我做到了,但不起作用。你真的是這個意思嗎,還是你忘了編輯我的初始輸入? – user1940136

+0

我的回答有點泛泛,重新命名並修正了你的情況。這個想法是一旦你可以歸檔到NSData你有一些可以通過'NSUserDefaults'保存/恢復的東西。 – zaph

相關問題