How to set initial values for NSUserDefault Keys?
Solution 1
You should use the registerDefaults
method of NSUserDefaults
. Prepare a plist file in your bundle that contains the default preferences and then use that plist to register the defaults.
NSString *defaultPrefsFile = [[NSBundle mainBundle] pathForResource:@"defaultPrefs" ofType:@"plist"];
NSDictionary *defaultPreferences = [NSDictionary dictionaryWithContentsOfFile:defaultPrefsFile];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultPreferences];
You have to execute this code on every launch of your app. It will add these values to a separate domain in the user defaults hierarchy. Whenever your app's user defaults don't provide a value for a certain key, NSUserDefaults
will fall back to this domain and retrieve the value from there.
Solution 2
If you have many default values, let use ola's answer, otherwise this is good for a few params
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults boolForKey:USERDEFAULT_IS_INITIALIZED]) {
[defaults setBool:YES forKey:USERDEFAULT_IS_INITIALIZED];
// Set initial values
...
[defaults synchronize];
}
Related videos on Youtube
Suz
Scientist/mum turned programmer. iOS Developer at Depict.com art + data + the internet of things
Updated on July 09, 2022Comments
-
Suz almost 2 years
I want to set some initial values for my NSUserDefault keys so that the first run of the app has some reasonable initial settings. I thought I ran across a simple way to do this in the app bundle .plist, but now I can't find it. Any ideas?
-
Jayprakash Dubey almost 10 years
-
-
Suz over 12 yearsIt looks like this registers the defaults to a volatile memory location. I don't want it to go back to defaults very often at all. This is mostly for 1st launch. Will the user-set values be preserved, or will they occasionally be over-written by this?
-
Ole Begemann over 12 yearsWhat do you mean by "volatile memory location"? You have to execute this code on every launch of your app. It will add these values to a separate domain in the user defaults hierarchy. Whenever your app's user defaults don't provide a value for a certain key,
NSUserDefaults
will fall back to this domain and retrieve the value from there. -
Suz over 12 yearsThe User Defaults Programming Guide lists the NSRegistrationDomain as having a 'volatile' state, as opposed to 'persistent'. So, the user default settings themselves are persistent and the defaults are volatile, and have to be reloaded on every app launch. It just seems odd to me that the 'fall back' value is less persistent than the user setting.
-
Ole Begemann over 12 yearsI agree it seems a little odd but it works just fine and does make sense when you think about it.
-
Dave Batton about 12 yearsThis really isn't the correct way to to it. Works, but it's not what Apple suggests. Use -registerDefaults as described in the answer by @ole, or add them directly to the NSRegistrationDomain domain.
-
James Webster about 12 yearsI agree. I didn't know about registerDefaults when I wrote this answer but I use it now.
-
Lance over 10 years@OleBegemann you should move your first comment, or part of it anyway, up into your answer. That was the first time I understood what
registerDefaults
actually did!