79

Quando viene caricato il rootViewController della mia applicazione, desidero essere in grado di verificare se le credenziali di accesso degli utenti sono state salvate su NSUserDefaults.iOS: utilizzare un valore booleano in NSUserDefaults

Fondamentalmente, quando l'utente carica l'applicazione e non ha le credenziali di accesso salvate, verrà inviato un modalAlertView e l'utente sarà in grado di salvare le proprie credenziali in modo appropriato. Ciò consente di salvare le stringhe UITextField in un rispettivo oggetto NSUserDefault. Tuttavia, è possibile, quando questo salvataggio è fatto, posso creare un oggetto NSUserDefault che è un booleano e cambiare il valore in un sì?

Significa che il valore booleano è già impostato su no e quando l'utente salva le proprie credenziali di accesso, cambia anche il valore booleano in un sì?

risposta

245

È possibile impostare il valore booleano utilizzando:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"logged_in"]; 

e leggerlo utilizzando questo codice:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) { 
    [self displayLogin]; 
} else { 
    [self displayMainScreen]; 
} 
+7

Accidenti a te sta bene! –

+0

@Henril P .Can esso visualizzare lo stesso utente che è stato in precedenza il login – Ajay

2

Non è necessario ad esso impostato NO prima, invece si può controllare se è stata impostata una chiave. In caso contrario, e se la tua app determina che le credenziali sono complete, basta crearlo e impostarlo su YES.

Controllare my answer to another question per vedere come faccio di solito questo.

10

C'è un metodo in NSUserDefaults chiamato registerDefaults:. Questo metodo viene utilizzato per impostare i "valori predefiniti predefiniti" dell'applicazione. Fondamentalmente, si crea uno NSDictionary contenente le chiavi e i valori predefiniti (nel tuo caso un NO per una chiave "credenziali salvate") e lo si registra usando registerDefaults:. Questo se spesso viene eseguito nel metodo + (void)initialize del delegato della app per garantire che i valori predefiniti siano registrati prima che siano necessari. Questi valori vengono utilizzati solo se la tua app non li ha sostituiti. In altre parole, non verranno utilizzati a meno che la chiave che stai cercando non si trovi nel dominio dell'applicazione, ovvero i valori predefiniti dall'utente letti dal file .plist dell'utente.

D'altra parte, è possibile controllare le credenziali di accesso e far apparire un avviso se mancano. Ciò elimina la necessità di mantenere il valore booleano sincronizzato con le credenziali di accesso. Se in seguito fornisci la funzionalità "cancella credenziali di accesso", non dovrai ricordarti di impostare il valore booleano su NO. Se le credenziali di accesso vengono salvati in default dell'utente, faresti questo:

NSString *userID = [[NSUserDefaults standardUserDefaults] stringForKey:@"userID"]; 
NSString *password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password"]; 
if (userID != nil && password != nil) { 
    // Code to log user in 
} else { 
    // Code to pop up an alert 
} 
+0

Come potrei fare a scrivere un metodo che controlla le credenziali di accesso e appena si apre l'avviso se non sono salvati? –

+0

Vedere la risposta aggiornata. –

+4

Non si dovrebbe nemmeno pensare di memorizzare le password in NSUserDefaults. –

5

Questa soluzione, suggerita da Henrik P. Hessel:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) { 
[self displayLogin]; 
} else { 
[self displayMainScreen]; 
} 

avrebbe funzionato nel tuo caso, ma tenere a mente che non dovresti controllare con questo codice se qualche tasto è impostato, perché se effettivamente è impostato e impostato su "NO", otterresti comunque un risultato come se non fosse impostato affatto. Invece vorrei usare

if([[NSUserDefaults standardUserDefaults] objectForKey:@"logged_in"] == nil) { 
    //Do something 
} 
-1

Swift 2.3

per memorizzare i valori

NSUserDefaults.standardUserDefaults().setBool(false, forKey: "logged_in") 

Per i valori che vanno a prendere

if NSUserDefaults.standardUserDefaults().boolForKey("logged_in") == true { 
     dashboardScreen() 
    }else { 
     loginScreen() 
    } 

Swift 3,0

per memorizzare i valori

UserDefaults.standard().setBool(true, forKey: "logged_in") 

per recuperare i valori

UserDefaults.standard().bool(forKey: "logged_in"){ 
     dashboardScreen() 
    }else { 
     loginScreen() 
    } 
0

a Swift 3

let Defaults = UserDefaults.standard()() 
let exists = Defaults.bool(forKey: "isLoggedIn") 

if !exists { 
    displayLoginScreen()    
} else { 
    print("value exists..do something") 
    displayMainScreen()  
}  

in alternativa possiamo utilizzare object(forKey:) poi gettato a bool

if let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true { 
    displayMainScreen() 
} else { 
    displayLoginScreen() 
} 
Problemi correlati