iPhone - Как определить, существует ли ключ в NSUserDefaults standardUserDefaults - PullRequest
32 голосов
/ 22 марта 2011

Использование NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];,

Я использую звонки типа BOOL boolFromPrefs = [defaults boolForKey:@"theBoolKey"]; Чтобы получить сохраненное значение BOOL.

Если ключ не найден, возвращается NO (поведение по умолчанию boolForKey).
Но ... НЕТ может быть сохраненной настройкой. То же самое для intForKey

Так, как я могу проверить, существует ли ключ, прежде чем пытаться получить его значение?

Ответы [ 8 ]

62 голосов
/ 22 марта 2011

Сделайте это правильно и зарегистрируйте значения по умолчанию .

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

сделайте это, прежде чем использовать что-либо из NSUserDefaults.Начало application:didFinishLaunchingWithOptions: - безопасное место.

Вы должны регистрировать значения по умолчанию при каждом запуске приложения.NSUserDefaults хранит только те значения, которые были явно установлены.

Если вы используете значения по умолчанию, вам не нужно использовать проверку для ключа «isFirstLaunch», как предложено в других ответах.
Это поможет вам, когда вы выкатываете обновление и хотитеизменить значение по умолчанию для элемента NSUserDefaults.

30 голосов
/ 22 марта 2011

Проверьте, существует ли объект перед преобразованием в BOOL.

if ([defaults objectForKey:@"theBoolKey"] != nil) {
    boolFromPrefs = [defaults boolForKey:@"theBoolKey"];
} else {
    boolFromPrefs = DEFAULT_BOOL_VALUE;
}
24 голосов
/ 19 октября 2012

Я сделал это так:

NSUserDefaults *prefs = NSUserDefaults.standardUserDefaults;
if ([[prefs dictionaryRepresentation].allKeys containsObject:@"yourKey"]) {
  float yourValue = [prefs floatForKey:@"yourKey"];
}
8 голосов
/ 22 марта 2011

Вы можете проверить с помощью objectForKey:, и если это ноль, то это не установлено. Все, что делает boolForKey, возвращает NSNumber, если он есть, и возвращает значение BOOL.

2 голосов
/ 22 марта 2011

Я бы рекомендовал установить значения по умолчанию для любой клавиши, которую может использовать ваше приложение. Вы можете сделать это в приложении: didFinishLaunchingWithOptions: метод. Таким образом, вы будете знать, что каждое значение было установлено.

Подсказка, установите ключ с именем "defaultsSet" на YES, чтобы вы делали это только один раз. Кроме того, не забудьте вызвать [[NSUserDefaults standardUserDefaults] синхронизации], чтобы сохранить значения.

0 голосов
/ 25 апреля 2017

Не усложняйте это:

if([NSUserDefaults.standardUserDefaults  objectForKey:@"yourBoolKey"])
{
  // Object Already Stored in User defaults
}
else
{
   //Object not stored
}
0 голосов
/ 05 сентября 2015

быстрая версия ответа @Tim Autin:

if contains(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array, "chuiser_cook_orders_dirty") {
    println("exist")
} 
0 голосов
/ 03 сентября 2015

Пример 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)")
}
...