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 中加载的主要内容,如果未能解决你的问题,请参考以下文章

UIWebView 未在 ios 中加载

webview 正在模拟器中加载,但未在设备中加载

url 未在 UIWebView 中加载

数据未在 UITableView 中加载。可能是啥问题?

图像未在 Flutter 中加载

CSS 未在 WKWebView 中加载