John Westlund
John Westlund

Reputation: 336

Initialize IOS Preferences from Preference Bundle on first App load

In my AppDelegate.m I'm trying to initialize the default values from my Preference Bundle if the user hasn't gone to the settings pane yet. The initialize runs, and I see the correct number of objects for my preferences but they're all null and nothing gets set.

+ (void)initialize {
    NSLog(@"Running settings initialization");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *settingsBundle =
    [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    NSDictionary *settings =
    [NSDictionary dictionaryWithContentsOfFile:
     [settingsBundle stringByAppendingPathComponent:@"Root.plist"]];

    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];
    NSMutableDictionary *defaultsToRegister =
    [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];

    [defaults registerDefaults:defaultsToRegister];
    [defaults synchronize];

}

Upvotes: 0

Views: 477

Answers (1)

Midhun MP
Midhun MP

Reputation: 107201

You are registering an empty dictionary.

Use :

+ (void)initialize
{
     NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
     [defs synchronize];

     NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];

     if(!settingsBundle)
     {
        NSLog(@"Could not find Settings.bundle");
        return;
     }

     NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
     NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];
     NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];

     for (NSDictionary *prefSpecification in preferences)
     {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if (key)
        {
           // Check if value is registered or not in userDefaults
           id currentObject = [defs objectForKey:key];
           if (currentObject == nil)
           {
              // Not registered: set value from Settings.bundle
              id objectToSet = [prefSpecification objectForKey:@"DefaultValue"];
              [defaultsToRegister setObject:objectToSet forKey:key];
              NSLog(@"Setting object %@ for key %@", objectToSet, key);
           }
           else
           {
              // Already registered
              NSLog(@"Key %@ is already registered with Value: %@).", key, currentObject);
           }
       }
   }

   [defs registerDefaults:defaultsToRegister];
   [defaultsToRegister release];
   [defs synchronize];
}

Upvotes: 2

Related Questions