2014-01-14 99 views
1

在我的應用程序中,我保存的一件事是一組開關的值。這個想法是將每個開關的狀態保存在NSMutableDictionary中。在另一種方法中,我讀出每個開關的值(「狀態」),並用它來執行簡單的計算。基本上,這些開關告訴我用戶有什麼。將NSMutableDictionary保存爲NSUserDefaults

在我的數據模型中。

-(void)savePlates:(NSMutableDictionary *)settingPlates { 
    [self setObject:settingPlates forKey:@"plates"]; 
    [self synchronize]; 
} 

-(NSMutableArray *)loadPlates { 
    NSMutableArray *plates = [[self dictionaryForKey:@"plates"] mutableCopy]; 
    return plates; 
} 

在視圖控制器中使用它的一個例子。其中「設置」是定義上述方法的類的一個實例。

-(IBAction)switch55:(id)sender { 
    if (self.switch55.on) { 
     [self.plateSelectionDict setObject:@YES forKey:@55]; 
    } else { 
     [self.plateSelectionDict setObject:@NO forKey:@55]; 
} 

    [settings savePlates:self.plateSelectionDict]; 

    if (DEBUG) { 
     NSLog(@"%@", self.plateSelectionDict); 
    } 
} 

我在這條線上崩潰。 [self setObject:settingPlates forKey:@「plates」];

的錯誤是,

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
    '*** -[Settings setObject:forKey:]: attempt to insert non-property list object { 
    55 = 0; 
    25 = 1; 
    "0.25" = 1; 
    "0.5" = 1; 
    "0.75" = 1; 
    45 = 1; 
    15 = 0; 
    1 = 1; 
    10 = 1; 
    "2.5" = 1; 
    35 = 1; 
    5 = 1; 
    } for key plates' 

什麼是混淆是它吐出正確的價值觀,但仍然拋出異常。我一定在做一些非常錯誤的事情。任何援助將不勝感激。

回答

3

如果您需要將它保存到NSUserDefaults或plist,所有鍵必須是字符串。你的鑰匙是數字。

+0

這指出我在一個答案的方向。如果將NSDictionary作爲屬性保存,則密鑰必須是字符串。謝謝。 – Jeremy

+0

你爲什麼不選中我的答案並選擇其他答案?另一個答案是錯誤的。它聲明你的數字鍵是有效的。他們不是。他們必須像我說的那樣是字符串。 – rmaddy

0

要將對象保存爲用戶默認值,您的對象需要是有效的屬性列表對象。 如果您想檢查哪些對象是有效的屬性列表對象,只需創建一個新的plist文件並使用它播放一段時間,添加一些條目,然後您將看到哪些類型已經處理/可以保存,而無需預先處理讀/寫它們。 乍一看,你的值似乎是布爾值和字符串/ nsnumbers鍵,這是有效的。 我建議打印出對象的類並檢查它們是否都是真正有效的。 您可以在這裏得到更多的信息 https://developer.apple.com/library/ios/documentation/cocoa/conceptual/PropertyLists/Introduction/Introduction.html

+0

感謝您的鏈接。對,字典是int/double鍵和bool值。顯然,鍵必須是字符串來保存他們,我想要的方式。很高興知道,雖然不直觀。 – Jeremy

相關問題