Po rootViewController
zał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, modalAlertView
zostanie wypchnięty przycisk, a użytkownik będzie mógł odpowiednio zapisać swoje poświadczenia. To zapisuje te UITextField
ciągi do odpowiedniego NSUserDefault
obiektu. Czy jest jednak możliwe, że po wykonaniu tego zapisu mogę utworzyć NSUserDefault
obiekt, 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?
źródło
Istnieje metoda w
NSUserDefaults
nazwieregisterDefaults:
. Tej metody używa się do ustawiania „domyślnych ustawień domyślnych” aplikacji. Zasadniczo tworzysz plikNSDictionary
zawierają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)initialize
metodzie 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 }
źródło
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 }
źródło
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 naYES
.Sprawdź moją odpowiedź na inne pytanie, aby zobaczyć, jak zwykle to robię.
źródło
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 boolif let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true { displayMainScreen() } else { displayLoginScreen() }
źródło
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() }
źródło