NSUserDefaults的。 setValue有效,不是setBool

时间:2012-03-06 09:27:47

标签: objective-c nsuserdefaults

我尝试在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,如果没有则为零。

4 个答案:

答案 0 :(得分:9)

你怎么能确定它不起作用?我尝试了你的代码,它适用于我。你确定你在写完之后正确地读取布尔值吗?

这段代码应该可以工作:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey:@"test"];

[defaults synchronize];

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

答案 1 :(得分:2)

我在AppDelegate中使用以下代码来跟踪用户是否看到特定的viewController来显示演练,然后在用户看到它之后将此Bool设置为NO,我遇到了同样的问题。

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

但是当你稍后将它设置为NO并检查它是否“存在”时,你实际上看到了NO布尔值并将其设置回是。快速修复只是将布尔值存储在NSNumber对象中,以便您可以检查它是否存在,而不管其值是YES还是NO。见下文:

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

答案 2 :(得分:1)

我遇到了完全相同的问题。除了BOOL之外的所有东西都是正确的;但我正在使用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。可能只是换掉整数的bool ......

答案 3 :(得分:1)

XCode 4.6似乎有相同的问题由hangzhouharry突出显示。一个有用的调用是[[NSUserDefaults standardUserDefaults] dictionaryRepresentation],看看你的键值是否看起来应该如何。

例如 - > autoLogout = 0;

设置为Bool,[设置boolForKey:@“autoLogout”]不返回任何内容

[settings integerForKey:@“autoLogout”]返回0(as,sort,expected)