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