AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

Hola a todos,

He configurado en mi aplicación iOS4 una ventana de preferencias de usuario y el problema es que al consultar determinadas key obtengo como resultado nil, aún cuando tienen valores.

Copio un fragmento del fichero Root.plist donde está definidas las keys y sus valores

    <dict>
        <key>Type</key>
        <string>PSToggleSwitchSpecifier</string>
        <key>Title</key>
        <string>Movimientos recurrentes</string>
        <key>Key</key>
        <string>enabled_preference</string>
        <key>DefaultValue</key>
        <false/>
    </dict>
    <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Versión de la base de datos</string>
        <key>Key</key>
        <string>database</string>
        <key>DefaultValue</key>
        <string>v2.1</string>
    </dict>

El caso es que si quiero recuperar el valor de la key enabled_preference obtengo el valor correcto, false.

NSUserDefaults *nsUser = [NSUserDefaults standardUserDefaults];
[nsUser synchronize];
bool b = [nsUser boolForKey:@"enabled_preference"];

En cambio para la key database siempre me duevuelve nil

[nsUser stringForKey:@"database"];

Muchas gracias, por ayudarme. Un saludo.

preguntado 10 Ago '11, 22:52

Davix's gravatar image

Davix ♦
2.0k81636


El problema es relativamente conocido, pero esos DefaultValue no se establecen como default hasta que se abre la aplicación de Ajustes (Settings.app) y se accede a la ventana de configuración de la aplicación.

Por suerte NSUserDefaults proporciona - (void)registerDefaults:(NSDictionary *)dictionary que permite registrar los valores por defecto que se deben utilizar. Obviamente especificar los valores por defecto en dos sitios diferentes es bastante poco inteligente, pero por suerte Settings.bundle está dentro del bundle de nuestra aplicación, y por lo tanto podemos leer Root.plist desde el inicio de nuestra aplicación.

- (void)applicationDidFinishLaunching:(UIApplication *)application {
  // Usar objectForKey nos asegura que tendremos un nil si los defaults no han sido registrados.
  id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"uno de tus keys"];

  if (!obj) {
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];
    NSMutableDictionary *defaults = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *preference in preferences) {
      NSString *key = [preference objectForKey:@"Key"];
      if (key) {
        [defaults setObject:[preference objectForKey:@"DefaultValue"] forKey:key];
      }
    }

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
    [defaults release];
  }
}

Por cierto, el boolForKey: también te estaba fallando, pero es que boolForKey devuelve NO cuando la clave por la que preguntas no existe, que coincidentemente era tu valor por defecto. Por eso es mejor utilizar directamente objectForKey: en el código de más arriba: nil siempre significa no encontrado.

enlace permanente

respondido 11 Ago '11, 01:50

YoNoSoyTu's gravatar image

YoNoSoyTu
4.7k1962

Muchas gracias! me ha servido tu código

(12 Ago '11, 23:42) Davix ♦
Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×7
×3

Pregunta realizada el: 10 Ago '11, 22:52

Pregunta visitada: 327 veces

Última modificación: 12 Ago '11, 23:42

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación