iphone dev - NSUserDefaults检查布尔存在

时间:2009-12-27 11:22:40

标签: 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
}

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

任何想法?

3 个答案:

答案 0 :(得分:17)

首先,您的if条件中存在错误。您正在检查布尔值本身,根据boolForKey: documentation,如果尚未设置,则返回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"];
    }
}

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

if (![prefs objectForKey:@"pref_sound"]) {

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

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

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

答案 1 :(得分:1)

也许最好的想法是使用

为NSUserDefaults注册一些默认值
(void)registerDefaults:(NSDictionary *)dictionary

请参阅Apple文档 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html#//apple_ref/doc/uid/20000318-SW5

回到原来的问题:过去我使用NSUserDefaults.dictionaryRepresentation来检查密钥是否存在:

BOOL playSound;
BOOL playVibrate;

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


if (playSound) {
    //do stuff
}

希望这适合你。

答案 2 :(得分:0)

凯文康纳的解决方案对我有用,但我认为应该指出另一件事。

我的应用程序优先选择左撇子作为默认值。当我在Xcode中运行时,使用该应用程序将我的偏好更改为左手,然后再次运行它,我的偏好仍然是右手。

似乎在Xcode中运行会删除设置。我决定从里面模拟器中手动退出应用程序,从里面再次打开它,然后我看到了我的新偏好。