如果您在應用的1.0版本中使用registerDefaults:
,那很簡單。當你停下來註冊這些舊值時,它們不會被用戶更改,它們會從NSUserDefaults中消失。
因此,請求NSUserDefaults所有應該轉換的對象。如果存在,則將它們轉換爲新格式,將它們保存在NSUserDefaults中並刪除舊值。
像這樣的東西應該工作
// check if you can get the old object. if it's there it was changed by the user
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"OldKey1"]) {
// old key is present
id oldObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"OldKey1"];
id newObject = ... // convert the old object to the new object
[[NSUserDefaults standardUserDefaults] setObject:newObject forKey:@"NewKey1"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"OldKey1"];
}
else {
// old key not there, do nothing
}
// register your new defaults...
如果你還沒有使用registerDefaults:
你現在有一個問題。因爲您不知道用戶是否更改了該對象,或者該對象只是您的默認對象。而且您不能認爲該值仍然處於默認狀態,只是因爲它具有與默認值相同的值。
但在這種情況下該怎麼辦?我可能會重置爲默認值,並顯示一個UIAlert,告訴用戶檢查首選項,因爲我犯了一個錯誤:-)
@fluchtpunkt:太好了。這就是我開始編寫代碼的方式。但你如何處理prefs版本。我計劃在plist中加入prefs版本。因爲當你使用8.5版本的時候,你必須知道你正在閱讀的是哪個版本的prefs,以便知道要調用哪些鍵以及如何解釋它們的內容。因爲您可以在1.0版本中使用KeyCodeAAA,該版本不包含與3.2版本中使用的KeyCodeAAA相同的內容或格式(請參閱我對日期的編輯(可能是其他任何內容))讓我們假設用戶更改了日期,你正在運行一個2.0應用程序)。 – Oliver 2011-03-26 15:52:45
當然,將該版本添加到首選項。這是您不能使用registerDefaults的少數例外之一。哦,如果你想保存日期,你應該保存NSDate對象。 – 2011-03-26 15:59:08
@fluchtpunkt:如何處理舊密鑰與新的默認密鑰衝突,這些密鑰沒有相同的內容或格式?您可以在啓動時使用默認值初始化它們,但是當您想知道是否存在舊值時,只需覆蓋當前值(如果存在)。但是你不知道objectForKey的返回值是舊的還是新的,或者你必須用新的值來測試所有的值,看看它們是否不同......你如何處理這個? – Oliver 2011-03-26 16:06:57