NSUserDefaults.setValue起作用,但setBool不起作用。

8
我尝试在NSUserDefaults中存储一些设置,但似乎应用程序不会存储setBool值。
以下代码可以正常工作:
``` [[NSUserDefaults standardUserDefaults] setValue: @"hello" forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize]; ```
当我终止应用并重新启动时,值已保存。然而,当我执行以下代码时:
``` [[NSUserDefaults standardUserDefaults] setBool: YES forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize]; ```
在关闭应用程序并重新启动后,它将无法保存。
我应该提交错误报告吗?还是我漏掉了什么?
谢谢!
编辑:
我发现自己做错了。在AppDelegate中,我想检查boolForKey是否被设置,如果没有,我会这样做:
if (![defaults boolForKey: @"test123"])
[defaults setBool: YES forKey: @"test123"];

然而,当涉及到boolWithKey时,“!”仅仅检查bool变量是否为YES或NO,而不是nil。

4个回答

9
你如何确定它不起作用?我尝试了你的代码,它对我有效。您确定在写入布尔值后以正确的方式读取布尔值吗?
这段代码应该有效:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey:@"test"];

[defaults synchronize];

BOOL myBool = [defaults boolForKey:@"test"];

1
忘记同步了 :Oo - Michal Shatz
2
由于NO是默认值,如果没有设置的话,上述代码不会测试任何内容。我们需要尝试使用YES进行测试才有意义。 - Marc

2

我曾经遇到了相同的问题,由于在我的AppDelegate中有以下代码来跟踪用户是否已经看过一个特定的viewController以显示教程,并在用户看过后将此Bool值设置为NO。

if (![standardUserDefaults boolForKey:@"firstViewOfVC"]) {
        [standardUserDefaults setBool:YES forKey:@"firstViewOfVC"];
}

但是,当你稍后将其设置为NO并检查它是否“存在”时,实际上你看到的是NO布尔值,并将其重新设置为YES。快速解决方法就是将布尔值存储在NSNumber对象中,这样你可以独立于其值是YES还是NO来检查它的存在性。请参见以下内容:

if (![standardUserDefaults objectForKey:@"firstViewOfVC"]){
        [standardUserDefaults setValue:[NSNumber numberWithBool:YES] forKey:@"firstViewOfVC"];
    }

1

我曾经遇到过完全相同的问题。除了BOOLs之外,所有东西都能正确持久化;但是我使用了一些来自iOS 3的旧编码风格。按照以下方式重新编写代码,一切都可以正常工作。

如果其他人也在使用旧书籍......这里有一个例子

不好的代码:

//////////// set / get bL2R
if (![[NSUserDefaults standardUserDefaults]
      boolForKey:kL2RomanizationChoice]) {
    [[NSUserDefaults standardUserDefaults]
     setBool:YES
     forKey:kL2RomanizationChoice];
    bL2R = YES;
    NSLog(@"L2Rom not found, set to YES.");
}
else {
    bL2R   = [[NSUserDefaults standardUserDefaults]
              boolForKey:kL2RomanizationChoice];
    NSLog(@"L2Rom found.");
    if (bL2R) {
        NSLog(@"L2Rom found to be YES.");
    }

}

好东西:

if (![defaults boolForKey:kL2RomanizationChoice])
    [defaults setBool:YES forKey:kL1RomanizationChoice];

L2String_Setting = [defaults objectForKey:kSecondLangChoice];
bL2R = [defaults boolForKey:kL2RomanizationChoice];

更新:遗憾的是,这似乎只是短暂地起作用,现在又失败了...使用Xcode 4.5.2。可能只需将布尔值替换为整数...

1
XCode 4.6似乎有与hangzhouharry指出的相同问题。 一个有用的调用是[[NSUserDefaults standardUserDefaults] dictionaryRepresentation],可以查看键值是否符合预期。
例如-> autoLogout = 0;
它被设置为Bool类型,[settings boolForKey:@"autoLogout"]没有返回值。
[settings integerForKey:@"autoLogout"]返回0(如所料)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接