2010-01-16 26 views
33

Tengo una clase AppDelegate con el método +(void)initialize que utilizo para registrar algunos valores predeterminados. Aquí está el código que utilizo:¿Cómo registrar los valores predeterminados del usuario utilizando NSUserDefaults sin sobreescribir los valores existentes?

+ (void)initialize { 
    NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:@"NO", @"fooKey", @"YES", @"barKey", nil]; 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 
} 

También creé Preferences.xib que mantiene par de casillas de verificación (NSButton) que el estado de visualización de preferencias. Están obligados a NSUserDefaultsController con las mismas teclas (fooKey y barKey en este caso). Cada vez que ejecuto una aplicación y cambio los "valores predeterminados", se restauran en el siguiente lanzamiento de la aplicación.

¿Hay alguna manera de registrar "valores predeterminados predeterminados" sin sobrescribir los valores ya existentes? ¿Tal vez cada vez que construyo y lance una aplicación, su archivo de preferencias se está recreando? ¿Tal vez debería desvincular las casillas de verificación del NSUserDefaultsController y mantener los valores de las claves yo mismo con algún código personalizado en el controlador de ventana de preferencias?

Me gustaría escuchar su implementación de elección para mantener los valores predeterminados del usuario.

Estoy utilizando Mac OS X 10.6.2 y 3.2.1 XCode

+0

Asegúrese de que las casillas de verificación están obligados a, tecla del controlador "valores", modelo caminos clave "fooKey" "predeterminados de usuario del controlador compartido"/"barkey". De lo contrario tu código se ve bien para mí. – Costique

+5

'@" NO "' no es un literal booleano; es una cadena literal para la palabra "NO". Debería usar '[NSNumber numberWithBool: NO]'; de lo contrario, los valores en los valores predeterminados del usuario no serán booleanos. –

+0

No, no lo serán, pero si los leo como BOOL, lo harán. Extracto del libro de Daniel H Steinberg "Programación Cocoa" (pragprog.com): en realidad, no necesita ser tan explícito cuando coloca el BOOL en el diccionario. Podría pasar el valor SÍ o NO como una cadena y aún así crear un BOOL a partir de este valor cuando lea de las preferencias. – Eimantas

Respuesta

75

De la documentación para -registerDefaults: (énfasis añadido):

Los contenidos del dominio de registro no están escritos en el disco ; necesita llamar a este método cada vez que su aplicación inicie. Puede colocar un archivo plist en el directorio de Recursos de la aplicación y llamar a registerDefaults: con los contenidos que haya leído desde ese archivo.

Así que su código estaba en el camino correcto. Así es como registra los valores predeterminados por defecto.

que suelen utilizar esto en -applicationDidFinishLaunching::

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

El uso de un plist hace que sea fácil añadir y cambiar valores por defecto en su aplicación, y que le impide hacer el error de usar @"NO" como un valor demasiado.

Editar: Swift 3 variante:

UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any]) 
+0

Johan - gracias por la revelación. Volví a verificar la llamada y parece que funciona sin ninguna declaración if. – Eimantas

+0

¿Se puede utilizar el código "cargar valores predeterminados predeterminados" arriba con el paquete Configuraciones? Por ejemplo, ¿podría usar el archivo Root.plist para inicializar mis valores predeterminados? – Ricky

+0

Sí, aunque su paquete de Configuraciones puede cargarse antes de que alguna vez se haya lanzado la aplicación, por lo que aún puede configurar los ajustes predeterminados iniciales en la configuración también. El método '-registerDefaults:' no anulará las preferencias establecidas a través de un paquete de Configuraciones. –

Cuestiones relacionadas