iOS: utilizza un valore booleano in NSUserDefaults


88

Quando rootViewControllerviene caricato il file della mia applicazione, voglio essere in grado di controllare se le credenziali di accesso degli utenti sono state salvate o meno in NSUserDefaults.

In pratica, quando l'utente carica l'applicazione e non ha salvato le proprie credenziali di accesso, modalAlertViewverrà inviato un push e l'utente potrà salvare le proprie credenziali in modo appropriato. Ciò salva quelle UITextFieldstringhe in un rispettivo NSUserDefaultoggetto. Tuttavia, è possibile che quando questo salvataggio è terminato, posso creare un NSUserDefaultoggetto che è un booleano e cambiare il valore in un sì?

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

Risposte:


263

Puoi impostare il tuo booleano utilizzando:

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

[[NSUserDefaults standardUserDefaults] synchronize];

e leggilo usando questo codice:

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

@Henril P. Può visualizzare lo stesso utente che aveva effettuato l'accesso in precedenza
Ajay

10

C'è un metodo in NSUserDefaultschiamato registerDefaults:. Si utilizza questo metodo per impostare i "valori predefiniti predefiniti" dell'applicazione. Fondamentalmente, crei un NSDictionarycontenente le tue chiavi e valori predefiniti (nel tuo caso un NO per una chiave "credenziali salvate") e lo registri usando registerDefaults:. Questo se spesso viene eseguito nel + (void)initializemetodo del delegato dell'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 le impostazioni predefinite dell'utente vengono lette dal file .plist dell'utente.

D'altra parte, potresti semplicemente controllare le credenziali di accesso e visualizzare un avviso se mancano. Ciò elimina la necessità di mantenere sincronizzato il valore booleano con le credenziali di accesso. Se in seguito fornisci una funzionalità di "eliminazione delle credenziali di accesso", non dovrai ricordarti di reimpostare il valore booleano su NO. Se le tue credenziali di accesso vengono salvate nelle impostazioni predefinite dell'utente, dovresti farlo:

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
}

come dovrei scrivere un metodo che controlli le credenziali di accesso e visualizzi solo l'avviso se non vengono salvati?
Sebastien Peek

4
Non dovresti nemmeno pensare di memorizzare le password in NSUserDefaults.
Krzysztof Przygoda

6

Questa soluzione, suggerita da Henrik P. Hessel:

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

funzionerebbe nel tuo caso, ma tieni presente che non dovresti controllare con questo codice se qualche chiave è impostata, perché se in realtà è impostata e impostata su "NO", otterrai comunque un risultato come se non lo fosse impostato affatto. Invece lo userei

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

2

Non è necessario impostarlo prima su NO, invece puoi controllare se è stata impostata una chiave. In caso contrario, e se la tua app determina che le credenziali sono complete, creala e impostala su YES.

Controlla la mia risposta a un'altra domanda per vedere come lo faccio di solito.


0

in 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 usare object(forKey:)quindi lanciarlo in bool

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

-1

Swift 2.3

Per memorizzare valori

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

Per il recupero dei valori

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

Swift 3.0

Per memorizzare valori

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

per recuperare i valori

  UserDefaults.standard().bool(forKey: "logged_in"){
      dashboardScreen()
  }else {
      loginScreen()
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.