2010-07-19 1 views
0

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

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

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> 

ответ

2

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

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

Для того, чтобы извлечь его из значения по умолчанию:

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

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

+0

По-прежнему не работает :(Как странно. Как будто ключ «dislaySunTimes» не устанавливается правильно. – paranoidroid

+0

Я отредактировал свой ответ. Посмотрите, разрешает ли он вашу проблему ... –

+0

Предпочитаю b99. подписанный знак. –

0
  • Немного странным использовать строку для представления значения BOOL. Попробуйте [NSNumber numberWithBOOL: YES] вместо. Как указывали другие (и я забыл), используйте API-интерфейсы boolForKey: и setBool:forKey: на NSUserDefaults.

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

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


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

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

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

+0

Все еще не с этим bool. Уверен, что у меня нет никаких предпочтений, я удалил приложение и снова установил его и попробовал снова. Мой root.plist выше. – paranoidroid

1

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

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

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

Строка не является булевой, поэтому @ «ДА» становится НЕТ. Попробуйте что-то вроде этого:

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithBOOL:YES] forKey:@"displaySunTimes"];