0
votes

One of the first things my app does when starting is registering default values for its settings:

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

Defaults.plist looks like this:

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

The correct values show up later when dumping the defaults dictionary:

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

The correct values are also returned when retrieving them specifically with [defaults floatForKey:@"WorkingHoursSaturday"]; and so on.

However, the Settings app displays the wrong times for these settings. Here's part of my Root.plist in 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>

And here's a screenshot of the settings app. WorkingHoursSaturday is set to 0, but the settings table still shows 8 hours:

What am I missing?

Edit: Once I set WorkingHoursSaturday in Code, by calling [defaults setInteger:0 forKey:@"WorkingHoursSaturday"];, Settings.app shows the correct value. Maybe the call to registerDefaults is somehow incorrect?

1

1 Answers

2
votes

The thing you're overlooking is that registerDefaults does not write anything to your app's user defaults database. It only acts as an override at runtime until someone explicitly writes a value to the user defaults.

The Settings app uses the default values you set in the Settings.bundle unless it finds a different value in the user defaults.

In other words, the default values in your Defaults.plist and Settings.Bundle should always match.