gpt4 book ai didi

iphone dev - NSUserDefaults 检查 bool 值是否存在

转载 作者:行者123 更新时间:2023-12-03 18:28:32 26 4
gpt4 key购买 nike

我刚刚向我的应用程序添加了一个设置包,但在读取 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”,代码就会将振动和声音更改为“yes” - 这意味着捕获“NOT”设置......

有什么想法吗?

最佳答案

首先,您的 if 条件中有一个错误。您正在检查 bool 值本身,根据 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: 将返回底层装箱 bool 对象(如果存在),或者 nil.

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

但我不确定 ADC 文档会认为什么是最佳实践。为了找到答案,我建议您查看从 NSUserDefaults 类引用中引用的所有代码示例。

关于iphone dev - NSUserDefaults 检查 bool 值是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1965765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com