Mat*_*cer 11 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
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果用户将设置设置为"NO",则代码将振动和声音都改为是 - 这意味着捕获NOT设置....
有任何想法吗?
Kev*_*ner 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"];
}
}
Run Code Online (Sandbox Code Playgroud)
一个更简单的解决方案(但我不确定这是否可行)将是将条件更改为:
if (![prefs objectForKey:@"pref_sound"]) {
Run Code Online (Sandbox Code Playgroud)
我再次不知道这是否会按照我的想象行事,但我想这objectForKey:
将返回底层的盒装布尔对象,如果它在那里,或者nil
.
如果您在新版本的应用中添加新设置,则不希望未初始化新设置,也不希望踩踏用户的现有设置.第二种方法可以轻松实现,在第一种方法中,它更容易搞砸.但是第一种方法也会在一个地方收集所有设置,这样你就可以看到它应该如何工作,我喜欢它.
我不确定ADC文档会考虑哪种最佳实践.为了找到答案,我建议您查看从NSUserDefaults
类引用中引用的任何代码示例.
归档时间: |
|
查看次数: |
13964 次 |
最近记录: |