如果您在应用的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