2012-03-06 10 views
8

Estoy tratando de almacenar algunas configuraciones en NSUserDefaults, pero parece que la aplicación no almacenará los valores de setBool.NSUserDefaults. setValue funciona, no setBool

Esto funciona:

[[NSUserDefaults standardUserDefaults] setValue: @"hello" forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize];

Cuando finalice la aplicación y reiniciarla, el valor se han salvado. Sin embargo, cuando hago esto:

[[NSUserDefaults standardUserDefaults] setBool: YES forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize]; No se guardará después de cerrar la aplicación y reiniciarla.

¿Debo presentar un informe de error o me falta algo aquí?

Gracias

Editar:

me imagino lo que hice mal. En AppDelegate, quería comprobar si se ajusta el boolForKey, y que no era lo hice: "!"

if (![defaults boolForKey: @"test123"]) 
[defaults setBool: YES forKey: @"test123"]; 

... Sin embargo, cuando se trata de boolWithKey, la simplemente verifique si el bool es SÍ o NO, no si es nulo.

Respuesta

9

¿Cómo puede estar seguro de que no funciona? Probé tu código y funciona para mí. ¿Estás seguro de que estás leyendo el booleano de la manera correcta DESPUÉS de escribirlo?

Este código debería funcionar:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setBool:NO forKey:@"test"]; 

[defaults synchronize]; 

BOOL myBool = [defaults boolForKey:@"test"]; 
+1

se olvidó de sincronizar: Oo –

+2

Puesto que el NO es el valor por defecto si no se ha establecido su. El código anterior no prueba nada. Tendríamos que probarlo con SÍ para que la prueba tenga sentido. – Marc

1

que tenían el mismo problema. Todo EXCEPTO BOOLs persistían correctamente; pero estaba usando algunos viejos estilos de codificación de ios 3. recodificados de esta manera, todo funciona.

Si alguien más está usando libros antiguos .... Este es un ejemplo

cosas malas:

//////////// set/get bL2R 
if (![[NSUserDefaults standardUserDefaults] 
     boolForKey:kL2RomanizationChoice]) { 
    [[NSUserDefaults standardUserDefaults] 
    setBool:YES 
    forKey:kL2RomanizationChoice]; 
    bL2R = YES; 
    NSLog(@"L2Rom not found, set to YES."); 
} 
else { 
    bL2R = [[NSUserDefaults standardUserDefaults] 
       boolForKey:kL2RomanizationChoice]; 
    NSLog(@"L2Rom found."); 
    if (bL2R) { 
     NSLog(@"L2Rom found to be YES."); 
    } 

} 

Eso está muy bien:

if (![defaults boolForKey:kL2RomanizationChoice]) 
    [defaults setBool:YES forKey:kL1RomanizationChoice]; 

L2String_Setting = [defaults objectForKey:kSecondLangChoice]; 
bL2R = [defaults boolForKey:kL2RomanizationChoice]; 

Actualización: por desgracia esto sólo parecía trabaje brevemente, y ahora está fallando de nuevo ... usando Xcode 4.5.2. solo puede intercambiar bools por enteros ...

1

XCode 4.6 parece tener el mismo problema destacado por hangzhouharry. Una llamada útil es [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] para ver si sus valores clave se ven como deberían.

Por ejemplo -> autoLogout = 0;

que fue establecido como un Bool, [ajustes boolForKey: @ "autologout"] devuelve nada

[ajustes integerForKey: @ "autologout"] devuelve 0 (como, más o menos, espera)

2

I Tuve el mismo problema al tener el siguiente código en mi AppDelegate para realizar un seguimiento de si el usuario había visto un viewController particular para mostrar un tutorial, y luego configurar este Bool en NO después de que el usuario lo hubiera visto.

if (![standardUserDefaults boolForKey:@"firstViewOfVC"]) { 
     [standardUserDefaults setBool:YES forKey:@"firstViewOfVC"]; 
} 

Pero entonces cuando se establece en NO más tarde y comprobar si "existe", en realidad se está viendo el valor booleano NO y el establecimiento de nuevo a sí. La solución rápida es solo almacenar el valor booleano en un objeto NSNumber para que pueda verificar su existencia, independientemente de que su valor sea SÍ o NO. Ver más abajo:

if (![standardUserDefaults objectForKey:@"firstViewOfVC"]){ 
     [standardUserDefaults setValue:[NSNumber numberWithBool:YES] forKey:@"firstViewOfVC"]; 
    } 
Cuestiones relacionadas