NSUserDefaults. setValue работает, Not setBool - PullRequest
8 голосов
/ 06 марта 2012

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

Это работает:

[[NSUserDefaults standardUserDefaults] setValue: @"hello" forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize];

Когда я закрываю приложение и перезапускаю его, значение сохраняется. Однако, когда я делаю это:

[[NSUserDefaults standardUserDefaults] setBool: YES forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize]; Он не сохранится после того, как я закрою приложение и перезапущу его.

Должен ли я подать отчет об ошибке, или я что-то упускаю здесь?

Спасибо

Редактировать:

Я понимаю, что я сделал не так. В AppDelegate я хотел проверить, был ли установлен boolForKey, и не я сделал это:

if (![defaults boolForKey: @"test123"])
[defaults setBool: YES forKey: @"test123"];

... однако, когда дело доходит до boolWithKey, "!" просто проверьте, является ли bool ДА или НЕТ, а не если его ноль.

Ответы [ 4 ]

9 голосов
/ 06 марта 2012

Как вы можете быть уверены, что он не работает?Я попробовал ваш код, и он работает для меня.Вы уверены, что правильно читаете логическое значение ПОСЛЕ того, как пишете?

Этот код ДОЛЖЕН работать:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey:@"test"];

[defaults synchronize];

BOOL myBool = [defaults boolForKey:@"test"];
2 голосов
/ 26 ноября 2014

У меня возникла та же проблема: в моем AppDelegate был приведен следующий код для отслеживания того, видел ли пользователь определенный viewController для отображения пошагового руководства, а затем установил для этого Bool значение NO после того, как пользователь его увидел.

if (![standardUserDefaults boolForKey:@"firstViewOfVC"]) {
        [standardUserDefaults setBool:YES forKey:@"firstViewOfVC"];
}

Но затем, когда вы позже установите его на NO и проверите, существует ли он, вы фактически видите логическое значение NO и снова установите его на yes.Быстрое решение состоит в том, чтобы просто сохранить логическое значение в объекте NSNumber, чтобы вы могли проверить его существование, независимо от того, является ли его значение YES или NO.Смотрите ниже:

if (![standardUserDefaults objectForKey:@"firstViewOfVC"]){
        [standardUserDefaults setValue:[NSNumber numberWithBool:YES] forKey:@"firstViewOfVC"];
    }
1 голос
/ 18 февраля 2013

XCode 4.6, кажется, имеет ту же проблему, выделенную Ханчжоухарри.Полезным вызовом является [[NSUserDefaults standardUserDefaults] dictionaryRepresentation], чтобы увидеть, выглядят ли значения ваших ключей так, как они должны быть.

Например -> autoLogout = 0;

, который был установлен как Bool, [settings boolForKey: @ "autoLogout"] ничего не возвращает

[settings integerForKey: @ "autoLogout"] возвращает 0 (как и ожидалось)

1 голос
/ 03 ноября 2012

У меня была точно такая же проблема. Все, кроме BOOL, сохранялось правильно; но я использовал несколько старых стилей кодирования из ios 3. перекодировано таким образом, все работает.

Если кто-то еще использует старые книги .... вот пример

Плохие вещи:

//////////// set / get bL2R
if (![[NSUserDefaults standardUserDefaults]
      boolForKey:kL2RomanizationChoice]) {
    [[NSUserDefaults standardUserDefaults]
     setBool:YES
     forKey:kL2RomanizationChoice];
    bL2R = YES;
    NSLog(@"L2Rom not found, set to YES.");
}
else {
    bL2R   = [[NSUserDefaults standardUserDefaults]
              boolForKey:kL2RomanizationChoice];
    NSLog(@"L2Rom found.");
    if (bL2R) {
        NSLog(@"L2Rom found to be YES.");
    }

}

Хорошие вещи:

if (![defaults boolForKey:kL2RomanizationChoice])
    [defaults setBool:YES forKey:kL1RomanizationChoice];

L2String_Setting = [defaults objectForKey:kSecondLangChoice];
bL2R = [defaults boolForKey:kL2RomanizationChoice];

Обновление: к сожалению, это, казалось, только ненадолго сработало, и теперь снова терпит неудачу ... используя Xcode 4.5.2. может просто поменять bools на целые числа ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...