Aunque se definen los parámetros predefinidos, que no son realmente almacena como un valor. Se almacenan por defecto. Si intenta leerlo, el valor es nulo. La configuración predeterminada es otra propiedad como valor. Pero eso no significa que escribirá el valor predeterminado como predeterminado.
Lo que hago es, primero, verificar si alguna configuración, (que estoy seguro de que debería tener un valor) tiene algo almacenado en ella. Si no tiene nada, escribo todos los valores predeterminados.
Aquí hay un ejemplo.
en AppDelegate.m Verifico si email_notificaciones_preference tiene un valor, si no, escribo TODAS las configuraciones predeterminadas para cada configuración.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString * email_notificaciones_preference = [standardUserDefaults objectForKey:@"email_notificaciones_preference"];
if (!email_notificaciones_preference) {
[self registerDefaultsFromSettingsBundle];
}
}
Esta función es la que uso para escribir valores predeterminados para cada elemento.
#pragma NSUserDefaults
- (void)registerDefaultsFromSettingsBundle {
// this function writes default settings as settings
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) {
[defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
NSLog(@"writing as default %@ to the key %@",[prefSpecification objectForKey:@"DefaultValue"],key);
}
}
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
}
Espero que ayude.
Gracias para guardar un montón de tiempo! –
Muy buena solución - Lo traduje a Swift y lo agregué como respuesta si alguien lo necesita. – Compufreak
¿Debe '' [[NSUserDefaults standardUserDefaults] sincronizar]; 'también se agregará? –