11

我刚刚向我的应用程序添加了一个设置包,但无法读取布尔设置。我知道在启动应用程序时,除非用户实际输入设置,否则不会读取设置 - 这就是我想要捕捉的内容。

但是,如果答案为 NO 或尚未设置,我的代码只是在捕获。我需要找出它们是否已设置,然后设置答案!

设置代码:

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
}

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

有任何想法吗?

4

3 回答 3

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"];
    }
}

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

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

同样,我不知道这是否会像我想象的那样做,但我想这objectForKey:将返回底层的盒装布尔对象,如果它在那里,或者nil.

如果您在应用程序的新版本中添加新设置,您不想让新设置保持未初始化状态,也不想破坏用户的现有设置。第二种方法很容易,而第一种方法更容易搞砸。但是第一种方法还将您的所有设置收集在一个地方,这样您就可以看到它应该如何工作,这是我喜欢的。

我不确定什么 ADC 文档会认为是最佳实践。要找出这一点,我建议您查看NSUserDefaults类参考中引用的任何代码示例。

于 2009-12-27T14:37:53.800 回答
1

也许最好的想法是使用 NSUserDefaults 注册一些默认值

(void)registerDefaults:(NSDictionary *)dictionary

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

回到你原来的问题:过去我使用 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
}

希望这对你有用。

于 2015-08-17T20:23:43.280 回答
0

Kevin Conner 的解决方案对我有用,但我认为我应该指出另一件事。

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

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

于 2012-07-12T19:27:58.743 回答