Настройки iPhone (NSUserDefaults) не работают, ключи всегда возвращают ноль - PullRequest
0 голосов
/ 19 июля 2010

Я установил некоторые настройки в своем файле Settings.bundle, которые хорошо отображаются в приложении «Настройки».Однако мои настройки всегда возвращают ноль, когда я читаю их обратно.Я знаю, что мне нужно установить значение по умолчанию при первом запуске.Но даже после этого и перехода в меню настроек (которое также должно устанавливать значения по умолчанию) - когда я читаю их обратно, я всегда получаю ноль.

Даже когда я устанавливаю значение по умолчанию и сразу же читаю его обратно, я получаю ноль!

  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"YES" forKey:@"displaySunTimes"];
  [defaults registerDefaults:appDefaults];
  [defaults synchronize];

  bool test =[defaults boolForKey:@"displaySunTimes"];
  NSLog(@" Value %@", test);

Вот начало моего root.plist

<dict>
    <key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array>
            <dict>
                    <key>Type</key>
                    <string>PSGroupSpecifier</string>
                    <key>Title</key>
                    <string>Display Sunrise / Sunset times for your location.</string>
            </dict>
            <dict>
                    <key>Type</key>
                    <string>PSToggleSwitchSpecifier</string>
                    <key>Title</key>
                    <string>Sunrise / Sunset</string>
                    <key>Key</key>
                    <string>displaySunTimes</string>
                    <key>DefaultValue</key>
                    <true/>
                    <key>TrueValue</key>
                    <string>YES</string>
                    <key>FalseValue</key>
                    <string>NO</string>
            </dict>

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Если вы хотите сохранить BOOL, используйте:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"displaySunTimes"];

Чтобы получить ее по умолчанию:

[[NSUserDefaults standardUserDefaults] boolForKey:@"displaySunTimes"];

EDIT Измените NSLog(@" Value %@", test); на NSLog(@" Value %i", test); (BOOL не является объектом).Кроме того, используйте BOOL вместо bool.

1 голос
/ 19 июля 2010

Помогает, если вы понимаете разницу между @"YES", [NSNumber numberWithBOOL:YES] и YES.

В этом случае возвращается «NO» ((BOOL)0), а не «nil» ((id)0).Используйте objectForKey:, если хотите узнать, сохранено ли что-то вообще.В этом случае вы сохраняете NSString @ "YES" и пытаетесь прочитать его как bool;Я отсылаю вас к документации для boolForKey:

Если логическое значение связано с defaultName в пользовательских значениях по умолчанию, это значение возвращается.В противном случае возвращается NO.

Строка не является логическим значением, поэтому @ "YES" становится NO.Попробуйте что-то вроде этого:

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithBOOL:YES] forKey:@"displaySunTimes"];
0 голосов
/ 19 июля 2010
  • Немного странно использовать String для представления значения bool. Вместо этого попробуйте [NSNumber numberWithBOOL: YES]. Как отмечали другие (и я забыл), используйте API-интерфейсы boolForKey: и setBool:forKey: в NSUserDefaults.

  • Когда я столкнулся с чем-то подобным, это потому, что мне каким-то образом удалось вставить неверное значение по умолчанию в базу данных по умолчанию. Вы уверены, что у вас нет значения по умолчанию из предыдущего прогона?

Регистрационные значения по умолчанию - это значение по умолчанию, которое используется, если значение не было предварительно установлено.

<Ч />

Если приложение и все данные не удаляются между каждым запуском, это все равно звучит так, как будто у вас уже установлено значение по умолчанию, и регистрация по умолчанию не отменяет его (правильное поведение).

Попробуйте вручную установить значение по умолчанию для какого-либо другого значения и выполнить синхронизацию.

Обратите внимание, что synchronize полностью ортогонально регистрационным значениям по умолчанию.

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