Неожиданная разница между NSUserDefaults и Settings.bundle (iOS 4.3) - PullRequest
0 голосов
/ 07 ноября 2011

Первое, что делает мое приложение при запуске, - регистрирует значения по умолчанию для своих настроек:

// Load default defaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];
[defaults synchronize];

Defaults.plist выглядит так:

<key>WorkingHoursFriday</key>
<integer>28800</integer>
<key>WorkingHoursMonday</key>
<integer>28800</integer>
<key>WorkingHoursSaturday</key>
<integer>0</integer>

Отображение правильных значенийпозже, когда выводит словарь значений по умолчанию :

WorkingHoursFriday = 28800;
WorkingHoursMonday = 28800;
WorkingHoursSaturday = 0;

Корректные значения также возвращаются при извлечении их специально с помощью [defaults floatForKey:@"WorkingHoursSaturday"]; и т. д.

ОднакоПриложение настроек отображает неправильное время для этих настроек.Вот часть моего Root.plist в Settings.bundle:

    <dict>
        <key>Type</key>
        <string>PSMultiValueSpecifier</string>
        <key>Title</key>
        <string>Monday</string>
        <key>Key</key>
        <string>WorkingHoursMonday</string>
        <key>DefaultValue</key>
        <integer>28800</integer>
        <key>Titles</key>
        <array>
            <string>Free</string>
            <string>8 Hours</string>
            ...
        </array>
        <key>Values</key>
        <array>
            <integer>0</integer>
            <integer>28800</integer>
            ...
        </array>
    </dict>
    <dict>
        <key>Type</key>
        <string>PSMultiValueSpecifier</string>
        <key>Title</key>
        <string>Friday</string>
        <key>Key</key>
        <string>WorkingHoursFriday</string>
        <key>DefaultValue</key>
        <integer>28800</integer>
        <key>Titles</key>
        <array>
            <integer>Free</integer>
            <integer>8 Hours</integer>
            ...
        </array>
    </dict>
    <dict>
        <key>Type</key>
        <string>PSMultiValueSpecifier</string>
        <key>Title</key>
        <string>Saturday</string>
        <key>Key</key>
        <string>WorkingHoursSaturday</string>
        <key>DefaultValue</key>
        <integer>28800</integer>
        <key>Titles</key>
        <array>
            <string>Free</string>
            <string>8 Hours</string>
            ...
        </array>
        <key>Values</key>
        <array>
            <integer>0</integer>
            <integer>28800</integer>
            ...
        </array>
    </dict>

А вот скриншот приложения настроек.WorkingHoursSaturday установлен в 0, но таблица настроек по-прежнему показывает 8 часов:

Хостинг imgur.com

Чего мне не хватает?

Редактировать : Как только я установил WorkingHoursSaturday в коде, вызвав [defaults setInteger:0 forKey:@"WorkingHoursSaturday"];, Settings.app покажет правильное значение.Может быть, звонок на registerDefaults как-то неверен?

1 Ответ

2 голосов
/ 07 ноября 2011

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

Приложение «Настройки» использует значения по умолчанию, которые вы установили в Settings.bundle, если не находит другое значение в пользовательских значениях по умолчанию.

Другими словами, значения по умолчанию в вашем Defaults.plist и Settings.Bundle всегда должны совпадать.

...