我刚刚在我的应用中添加了设置包,但在阅读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设置....
任何想法?
答案 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
回到原来的问题:过去我使用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中运行会删除设置。我决定从里面模拟器中手动退出应用程序,从里面再次打开它,然后我看到了我的新偏好。