iphone dev - NSUserDefaults检查布尔存在

Mat*_*cer 11 iphone nsuserdefaults

我刚刚将一个设置包添加到我的应用程序中,并且无法阅读bool设置.我知道,在启动应用程序时,除非用户实际输入设置,否则不会读取设置 - 这就是我想要捕获的内容.

但是,我的代码只是捕获答案是否为或者没有设置.我需要知道他们是否已经设定,然后设定答案!

设定代码:

BOOL playSound;
BOOL playVibrate;


//test for some defaults
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if (![prefs boolForKey:@"pref_sound"]) {
    playSound = YES;
    playVibrate = YES; 
} else {
    playSound = [prefs boolForKey:@"pref_sound"];
    playVibrate = [prefs boolForKey:@"pref_vibrate"]; 
}


if (playSound) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果用户将设置设置为"NO",则代码将振动和声音都改为是 - 这意味着捕获NOT设置....

有任何想法吗?

Kev*_*ner 17

首先,你的if条件有一个错误.您正在检查布尔值本身,根据boolForKey:文档,如果尚未设置,则返回NO.所以boolForKey:这不是正确的方法.

这是另外两个想法.

考虑使用另一个设置和另一个键来指定您的设置是否已初始化.启动应用程序或首次阅读设置时检查它.如果需要,初始化.例如:

- (void) initializeUserDefaults {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (nil == [defaults objectForKey:@"initialized_defaults"]) {
        [defaults setBool:YES forKey:@"pref_sound"];
        [defaults setBool:YES forKey:@"pref_vibrate"];
        [defaults setObject:@"dummy_value" forKey:@"initialized_defaults"];
    }
}
Run Code Online (Sandbox Code Playgroud)

一个更简单的解决方案(但我不确定这是否可行)将是将条件更改为:

if (![prefs objectForKey:@"pref_sound"]) {
Run Code Online (Sandbox Code Playgroud)

我再次不知道这是否会按照我的想象行事,但我想这objectForKey:将返回底层的盒装布尔对象,如果它在那里,或者nil.

如果您在新版本的应用中添加新设置,则不希望未初始化新设置,也不希望踩踏用户的现有设置.第二种方法可以轻松实现,在第一种方法中,它更容易搞砸.但是第一种方法也会在一个地方收集所有设置,这样你就可以看到它应该如何工作,我喜欢它.

我不确定ADC文档会考虑哪种最佳实践.为了找到答案,我建议您查看从NSUserDefaults类引用中引用的任何代码示例.

  • 谢谢你 - objectForKey似乎已经完成了这个伎俩!我注意到如果没有设置boolForKey将返回NO,所以尝试== nil,但这没有用.谢谢 :) (3认同)