NSUserDefaults 未在 IOS4 中加载
Posted
技术标签:
【中文标题】NSUserDefaults 未在 IOS4 中加载【英文标题】:NSUserDefaults not loading in IOS4 【发布时间】:2010-11-03 16:08:11 【问题描述】:我有一个在 OS 3.x 下编写的应用程序 - 当时它运行良好。 由于为 OS 4.1 重新构建,它不再适用于加载应用设置。
我有一个与应用程序捆绑在一起的“root.plist”文件。通过编辑文件已经在其中设置了一些默认设置,即主机名、超时等。新用户必须提供一些登录凭据,因此这些设置留空。当应用程序第一次启动时,它会检测到丢失的凭据并关闭,要求用户转到设置并输入凭据。 如果我打开设置,我会看到我所期望的;主机名、超时时间和其他默认值,就像它们在 root.plist 中一样。我输入用户名和密码,以及另一个 ID 代码。 当我重新启动应用程序时,我得到了刚刚键入的数据的值,加上 BOOL protocolswitch = YES(我没有更改)。尽管出现在设置中,其他值都返回 nil。
username = [[NSUserDefaults standardUserDefaults] stringForKey:@"name_preference"];
password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password_preference"];
CRMID = [[[[NSUserDefaults standardUserDefaults] stringForKey:@"userID_preference"]uppercaseString] retain];
hostname = [[NSUserDefaults standardUserDefaults] stringForKey:@"hostname_preference"];
protocolSwitch = [[NSUserDefaults standardUserDefaults] boolForKey:@"http_preference"];
timeout = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeout_preference"];
portNumber = [[NSUserDefaults standardUserDefaults] integerForKey:@"port_preference"];
bccEmail = [[NSUserDefaults standardUserDefaults] stringForKey:@"bcc_email_preference"];
locationOn = [[NSUserDefaults standardUserDefaults] boolForKey:@"location_preference"];
我知道“同步”,但我实际上并没有在我的应用程序中更改这些值,所以我看不出它是如何应用在这里的。我还确保应用程序在重新启动之前没有在后台运行,没有区别。 它在 OS4 之前完美运行,有人理解行为的变化吗?有什么办法解决吗? 干杯,
Sarge62。
设置结果肯定有问题。 在应用程序启动时将字典键转储到控制台后,我看到了:
"location_preference", NSInterfaceStyle, AppleLanguages, "userID_preference", AppleKeyboardsExpanded, AppleLocale, AppleKeyboards, NSLanguages, "http_preference", "password_preference", "name_preference"
plist 中只定义了五个键! 如果我转到设置并将主机名更改为 plist 默认值以外的名称,它将出现在上面的日志中。 似乎“设置”屏幕中有一个错误(?),它只注册从初始默认值更改的键(至少对于字符串对象,BOOLS 是可以的)。
【问题讨论】:
也发生在我身上,遇到 nil 时开始回退到“预打包”默认字典 刚刚提交了一个关于它的 Bug ID# 9908757 【参考方案1】:您是否注册了默认值?这通常在应用委托的 + (void) initialize
类方法中完成。
例如
+ (void)initialize
NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary];
[defaultValues setObject:@"defaultHostname" forKey:@"hostname"];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues];
【讨论】:
谢谢 Gorilla,但我不这么认为。我知道你的意思 - 我在 4.1 应用程序中有一些其他代码可以执行此操作 - 如果确定默认值不存在,它会读取 root.plist 文件并写回该字典的内容。 不太确定它是否表现得很奇怪。据我所知 NSUserDefaults 仅保存与您注册的默认值不同的首选项。这也符合你的观察。以上是关于NSUserDefaults 未在 IOS4 中加载的主要内容,如果未能解决你的问题,请参考以下文章