2012-03-06 10 views
8

Ho provato a memorizzare alcune impostazioni in NSUserDefaults, ma sembra che l'app non memorizzi i valori di setBool.NSUserDefaults. setValue funziona, non setBool

Questo funziona:

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

Quando ho terminare l'applicazione e riavviarlo, il valore sono state salvate. Tuttavia, quando faccio questo:

[[NSUserDefaults standardUserDefaults] setBool: YES forKey: @"test"]; [[NSUserDefaults standardUserDefaults] synchronize]; Non salverà dopo aver chiuso l'app e riavviarlo.

Devo presentare una segnalazione di bug o c'è qualcosa che mi manca qui?

Grazie

Edit:

ho dato quello che ho fatto di sbagliato. In AppDelegate, ho voluto verificare se il boolForKey è stato impostato, e non mi è stato fatto questo: "!"

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

... tuttavia, quando si tratta di boolWithKey, il basta controllare se il bool è SÌ o NO, non se è zero.

risposta

9

Come si può essere sicuri che non funzioni? Ho provato il tuo codice e funziona per me. Sei sicuro di leggere il booleano nel modo corretto DOPO averlo scritto?

Questo codice dovrebbe funzionare:

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

[defaults synchronize]; 

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

dimenticato di sincronizzare: Oo –

+2

Poiché NO è il valore predefinito se non è stato impostato. Il codice sopra non prova nulla. Dovremmo provare con SÌ perché il test abbia senso. – Marc

1

ho avuto lo stesso identico problema. Tutto ECCEZIONALE BOOL persisteva correttamente; ma stavo usando alcuni vecchi stili di codifica da iOS 3. ricodificati in questo modo, tutto funziona.

Se qualcun altro sta usando vecchi libri .... Ecco un esempio

roba Bad:

//////////// 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."); 
    } 

} 

Roba buona:

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

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

Update: purtroppo questo sembrava solo lavoro brevemente, e ora sta fallendo di nuovo ... usando Xcode 4.5.2. può semplicemente scambiare booletti per interi ...

1

XCode 4.6 sembra avere lo stesso problema evidenziato da hangzhouharry. Una chiamata utile è [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] per vedere se i valori delle chiavi stanno guardando come dovrebbero.

Ad esempio -> autoLogout = 0;

che è stato impostato come Bool, [Impostazioni boolForKey: @ "autologout"] restituisce nulla

[impostazioni integerForKey: @ "autologout"] restituisce 0 (come, una sorta di, previsto)

2

I ha avuto lo stesso problema avendo il seguente codice nel mio AppDelegate per tenere traccia di se l'utente aveva visto un particolare viewController per visualizzare una procedura dettagliata e quindi impostare questo Bool su NO dopo che l'utente l'aveva visto.

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

Ma poi quando si imposta su NO in seguito e verificare se "esiste", in realtà si sta vedendo il NO valore booleano e l'impostazione di nuovo a yes. La correzione rapida è solo per memorizzare il valore booleano in un oggetto NSNumber in modo che sia possibile verificarne l'esistenza, indipendentemente dal suo valore YES o NO. Vedi sotto:

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