iOS: użyj wartości logicznej w NSUserDefaults

88

Po rootViewControllerzaładowaniu mojej aplikacji chcę mieć możliwość sprawdzenia, czy dane logowania użytkowników zostały zapisane NSUserDefaults.

Zasadniczo, gdy użytkownik ładuje aplikację i nie ma zapisanych danych logowania, modalAlertViewzostanie wypchnięty przycisk, a użytkownik będzie mógł odpowiednio zapisać swoje poświadczenia. To zapisuje te UITextFieldciągi do odpowiedniego NSUserDefaultobiektu. Czy jest jednak możliwe, że po wykonaniu tego zapisu mogę utworzyć NSUserDefaultobiekt, który jest wartością logiczną i zmienić wartość na tak?

Oznacza to, że wartość logiczna jest już ustawiona na nie, a kiedy użytkownik zapisuje swoje dane logowania, zmienia również wartość logiczną na tak?

Sebastien Peek
źródło

Odpowiedzi:

263

Możesz ustawić wartość logiczną za pomocą:

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

[[NSUserDefaults standardUserDefaults] synchronize];

i przeczytaj go za pomocą tego kodu:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
    [self displayLogin];
} else {
    [self displayMainScreen];
}
Henrik P. Hessel
źródło
@Henril P. Czy może wyświetlić tego samego użytkownika, który był wcześniej zalogowany
Ajay
10

Istnieje metoda w NSUserDefaultsnazwie registerDefaults:. Tej metody używa się do ustawiania „domyślnych ustawień domyślnych” aplikacji. Zasadniczo tworzysz plik NSDictionaryzawierający domyślne klucze i wartości (w Twoim przypadku NIE dla klucza „zapisanych danych uwierzytelniających”) i rejestrujesz go za pomocą registerDefaults:. Dzieje się tak często w + (void)initializemetodzie delegata aplikacji, aby upewnić się, że ustawienia domyślne są rejestrowane, zanim będą potrzebne. Te wartości są używane tylko wtedy, gdy Twoja aplikacja ich nie zastąpiła. Innymi słowy, nie zostaną one użyte, chyba że szukanego klucza nie ma w domenie aplikacji, tj. Użytkownik domyślnie odczytuje plik .plist użytkownika.

Z drugiej strony możesz po prostu sprawdzić dane logowania i wyświetlić alert, jeśli ich brakuje. Eliminuje to konieczność synchronizacji wartości logicznej z danymi logowania. Jeśli później udostępnisz opcję „usuń dane logowania”, nie będziesz musiał pamiętać, aby ustawić wartość logiczną z powrotem na NIE. Jeśli Twoje dane logowania są zapisane w ustawieniach domyślnych użytkownika, możesz to zrobić:

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
}
James Huddleston
źródło
jak mam napisać metodę, która sprawdza dane logowania i po prostu wyświetla alert, jeśli nie są one zapisane?
Sebastien Peek
4
Nie powinieneś nawet myśleć o przechowywaniu haseł w NSUserDefaults.
Krzysztof Przygoda
6

To rozwiązanie, zaproponowane przez Henrika P. Hessela:

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

zadziała w twoim przypadku, ale pamiętaj, że nie powinieneś sprawdzać tym kodem, czy w ogóle jakiś klucz jest ustawiony, ponieważ jeśli faktycznie jest ustawiony i ustawiony na "NIE", nadal otrzymasz wynik tak, jakby nie był ustawione w ogóle. Zamiast tego użyłbym

if([[NSUserDefaults standardUserDefaults] objectForKey:@"logged_in"] == nil) {
    //Do something
}
Shiim
źródło
2

Nie musisz najpierw ustawiać go na NO, zamiast tego możesz sprawdzić, czy klucz został w ogóle ustawiony. Jeśli nie, i jeśli Twoja aplikacja stwierdzi, że poświadczenia są kompletne, po prostu utwórz je i ustaw na YES.

Sprawdź moją odpowiedź na inne pytanie, aby zobaczyć, jak zwykle to robię.

Toastor
źródło
0

w Swift 3

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

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

alternatywnie możemy użyć object(forKey:)then cast it to bool

if let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true {
  displayMainScreen()
} else {
  displayLoginScreen() 
}
Suhit Patil
źródło
-1

Swift 2.3

Do przechowywania wartości

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

Do pobierania wartości

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

Swift 3.0

Do przechowywania wartości

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

do pobierania wartości

  UserDefaults.standard().bool(forKey: "logged_in"){
      dashboardScreen()
  }else {
      loginScreen()
  }
Aditya
źródło