NSUserDefaults和Settings.bundle(iOS 4.3)之间的意外差异

时间:2011-11-07 11:16:35

标签: ios nsuserdefaults settings.bundle

我的应用在启动时所做的第一件事就是为其设置注册默认值:

// 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>

dumping the defaults dictionary

后会显示正确的值
WorkingHoursFriday = 28800;
WorkingHoursMonday = 28800;
WorkingHoursSaturday = 0;

使用[defaults floatForKey:@"WorkingHoursSaturday"];专门检索它们时,也会返回正确的值。

但是,“设置”应用会显示这些设置的错误时间。这是Settings.bundle中的Root.plist的一部分:

    <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小时:

我错过了什么?

修改:在Code中设置WorkingHoursSaturday后,通过调用[defaults setInteger:0 forKey:@"WorkingHoursSaturday"];,Settings.app会显示正确的值。也许对registerDefaults的调用有点不正确?

1 个答案:

答案 0 :(得分:2)

您忽略的是registerDefaults

它只在运行时作为覆盖,直到有人明确地将值写入用户默认值。

“设置”应用使用您在Settings.bundle中设置的默认值,除非它在用户默认值中找到不同的值。

换句话说,Defaults.plist和Settings.Bundle中的默认值应始终匹配。