web-dev-qa-db-ja.com

iPhone-NSUserDefaults standardUserDefaultsにキーが存在するかどうかを検出する方法

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];を使用して、

保存されたBOOL値を取得するには、BOOL boolFromPrefs = [defaults boolForKey:@"theBoolKey"];のような呼び出しを使用します。

キーが見つからない場合は、NOが返されます(boolForKeyのデフォルトの動作)。
しかし...いいえ、保存した設定はできません。 intForKeyも同じ

それで、値を取得する前に、キーが存在するかどうかをどのようにテストできますか?

32
Oliver

正しい方法で デフォルト値を登録 してください。

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

NSUserDefaultsから何かを使用する前にこれを行ってください。の始まり application:didFinishLaunchingWithOptions:は安全な場所です。

アプリを起動するたびにデフォルトを登録する必要があります。 NSUserDefaultsは、明示的に設定された値のみを保存します。

デフォルト値を使用する場合、他の回答で提案されているように、「isFirstLaunch」キーのチェックを使用する必要はありません。
これは、更新をロールアウトし、NSUserDefaultsアイテムのデフォルト値を変更する場合に役立ちます。

63
Matthias Bauch

BOOLに変換する前に、オブジェクトが存在するかどうかを確認してください。

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

私はこのようにしました:

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

objectForKey:を使用してテストできます。それがnilの場合は設定されません。すべてのboolForKeyは、もしあればNSNumberを返し、BOOL値を返します。

8
Joe

アプリケーションで使用する可能性があるすべてのキーにデフォルト値を設定することをお勧めします。これは、application:didFinishLaunchingWithOptions:メソッドで行うことができます。これにより、各値が設定されたことがわかります。

ヒント、「defaultsSet」というキーをYESに設定して、これを1度だけ行うようにします。また、[[NSUserDefaults standardUserDefaults] synchronize]を呼び出して値を保存することを忘れないでください。

2
picciano

@Tim Autinの回答のSwiftバージョン:

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

複雑にしないでください。

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

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)")
}
0
Michael