我刚刚向我的应用程序添加了一个设置包,但在读取布尔设置时遇到问题。我知道,在启动应用程序时,除非用户实际输入设置,否则不会读取设置 - 这就是我想要捕获的内容。
但是,我的代码只是捕获答案是否为“否”或尚未设置的情况。我需要查明它们是否已设置,然后设置答案!
设置代码:
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”,代码就会将振动和声音更改为“yes” - 这意味着捕获“NOT”设置......
有任何想法吗?
首先你的程序有一个bugif
有条件的。您正在检查布尔值本身,根据boolForKey:文档 http://developer.apple.com/Mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html#//apple_ref/occ/instm/NSUserDefaults/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
类参考。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)