¿Cómo registrar valores predeterminados del usuario utilizando NSUserDefaults sin sobrescribir los valores existentes?

StackOverflow https://stackoverflow.com/questions/2076816

Pregunta

Tengo una clase AppDelegate con el método +(void)initialize que utilizo para registrar algunos valores por defecto. Aquí está el código que utilizo:

+ (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 llaves iguales (fooKey y barkey en este caso). Cada vez que pongo en marcha una aplicación y cambiar el "defecto" que se restauran en el próximo lanzamiento de aplicaciones.

¿Hay una manera de registrar valores por defecto "default" sin sobrescribir los valores ya existentes? Tal vez cada vez que construir y lanzar un archivo de aplicación sus preferencias está siendo recreada? Tal vez debería desvincular casillas de verificación de NSUserDefaultsController y mantener los valores de claves a mí mismo con un poco de código personalizado en el controlador de ventana de preferencias?

Me gustaría escuchar su aplicación de elección para el mantenimiento de los valores predeterminados de usuario.

Estoy utilizando Mac OS X 10.6.2 y XCode 3.2.1

¿Fue útil?

Solución

A partir de la documentación para -registerDefaults: (énfasis añadido):

  

El contenido del registro del dominio no se escriben en el disco; necesita llamar a este método cada vez que se inicia la aplicación . Se puede colocar un archivo plist en el directorio de recursos de la aplicación y llame registerDefaults:. Con el contenido que usted lee desde ese archivo

Así que el código estaba en el camino correcto. Esta es la forma en que se registre valores predeterminados por defecto.

Yo suelo usar 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 de añadir y cambiar los valores predeterminados en su aplicación, y que le impide hacer el error de usar @"NO" como un valor demasiado.

Edit: Swift 3 variante:

 UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top