我在我的Settings.bundle中做了一些偏好,在“设置”应用中显示正常。但是当我读回它时,我的设置总是返回nil。我知道我需要在第一次启动时设置默认值。但即使在那之后并进入设置菜单(也应该设置默认值) - 当我回读它时,我总是没有。
即使我设置了默认值并立即将其读回来,我也没有了!
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"displaySunTimes"];
[defaults registerDefaults:appDefaults];
[defaults synchronize];
bool test =[defaults boolForKey:@"displaySunTimes"];
NSLog(@" Value %@", test);
这是我的root.plist
的开头<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Display Sunrise / Sunset times for your location.</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Sunrise / Sunset</string>
<key>Key</key>
<string>displaySunTimes</string>
<key>DefaultValue</key>
<true/>
<key>TrueValue</key>
<string>YES</string>
<key>FalseValue</key>
<string>NO</string>
</dict>
答案 0 :(得分:2)
如果您想存储BOOL,请使用:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"displaySunTimes"];
为了从默认值中检索它:
[[NSUserDefaults standardUserDefaults] boolForKey:@"displaySunTimes"];
修改的:
将NSLog(@" Value %@", test);
更改为NSLog(@" Value %i", test);
(BOOL不是对象)
此外,请使用BOOL
代替bool
。
答案 1 :(得分:1)
如果您了解@"YES"
,[NSNumber numberWithBOOL:YES]
和YES
之间的区别,这会有所帮助。
在这种情况下,它返回“NO”((BOOL)0
),而不是“nil”((id)0
)。如果您想知道是否存储了某些内容,请使用objectForKey:
。在这种情况下,您存储NSString @“YES”并尝试将其作为bool读取;我推荐你到boolForKey的文档:
如果布尔值与用户默认值中的defaultName相关联,则返回该值。否则,返回NO。
字符串不是布尔值,因此@“YES”变为NO。尝试这样的事情:
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithBOOL:YES] forKey:@"displaySunTimes"];
答案 2 :(得分:0)
使用String表示bool值有点奇怪。 尝试使用正如其他人指出的那样(我已经忘记了),请使用NSUserDefaults上的[NSNumber numberWithBOOL: YES]
。boolForKey:
和setBool:forKey:
API。
当我遇到类似这样的事情时,是因为我以某种方式设法将错误的默认值推送到默认数据库中。你确定你没有上一次运行的默认值吗?
注册默认值是以前未设置值时使用的默认值。
除非在每次运行之间删除应用程序和所有数据,否则这听起来仍然与您已设置的默认值完全相同,并且注册默认值不会覆盖它(正确的行为)。
尝试手动将默认值设置为其他值并进行同步。
另请注意,synchronize
与注册默认值完全正交。