iPhone - 如何检测NSUserDefaults standardUserDefaults中是否存在密钥

时间:2011-03-22 20:21:46

标签: iphone cocoa-touch nsuserdefaults preferences key-value

使用NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

我使用BOOL boolFromPrefs = [defaults boolForKey:@"theBoolKey"];之类的调用来获取保存的BOOL值。

如果未找到密钥,则返回NO(boolForKey的默认行为) 但是...... NO可以是一个保存的设置。 intForKey

也是如此

那么在尝试获取其值之前,如何测试密钥是否存在?

8 个答案:

答案 0 :(得分:62)

以正确的方式行事并register default values

NSDictionary *userDefaultsDefaults = @{
    @"SomeKey": @NO,
    @"AnotherKey": @"FooBar",
    @"NumberKey": @0,
};
[NSUserDefaults.standardUserDefaults registerDefaults:userDefaultsDefaults];

在使用NSUserDefaults中的任何内容之前执行此操作。 application:didFinishLaunchingWithOptions:的开头是一个安全的地方。

每次应用启动时都必须注册默认值。 NSUserDefaults仅存储已显式设置的值。

如果您使用默认值,则不必使用“isFirstLaunch”键检查,如其他答案中所建议的那样。
这将在您推出更新时帮助您,并且您想要更改NSUserDefaults项的默认值。

答案 1 :(得分:30)

在转换为BOOL之前检查对象是否存在。

if ([defaults objectForKey:@"theBoolKey"] != nil) {
    boolFromPrefs = [defaults boolForKey:@"theBoolKey"];
} else {
    boolFromPrefs = DEFAULT_BOOL_VALUE;
}

答案 2 :(得分:24)

我是这样做的:

NSUserDefaults *prefs = NSUserDefaults.standardUserDefaults;
if ([[prefs dictionaryRepresentation].allKeys containsObject:@"yourKey"]) {
  float yourValue = [prefs floatForKey:@"yourKey"];
}

答案 3 :(得分:8)

您可以使用objectForKey:进行测试,如果为零,则不会设置。所有boolForKey都会返回NSNumber返回(如果有)并返回BOOL值。

答案 4 :(得分:2)

我建议为应用程序可能使用的任何键设置默认值。您可以在应用程序中执行此操作:didFinishLaunchingWithOptions:方法。这样你就会知道每个值都已经设定好了。

提示,将名为“defaultsSet”的键设置为YES,这样您只需执行一次。另外,请记得调用[[NSUserDefaults standardUserDefaults] synchronize]来保存值。

答案 5 :(得分:0)

基于MarkPowell回答的Swift示例

if (NSUserDefaults.standardUserDefaults().objectForKey("SomeBoolSetting") == nil) {
    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "SomeBoolSetting")
    println("Bool WAS nil")
} else {
    var boolValue:Bool? = NSUserDefaults.standardUserDefaults().boolForKey("SomeBoolSetting")
    println("Bool WAS NOT nil \(boolValue)")
}

答案 6 :(得分:0)

@Tim Autin的快速版本答案:

if contains(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array, "chuiser_cook_orders_dirty") {
    println("exist")
} 

答案 7 :(得分:0)

不要让它复杂化:

if([NSUserDefaults.standardUserDefaults  objectForKey:@"yourBoolKey"])
{
  // Object Already Stored in User defaults
}
else
{
   //Object not stored
}