iOS: Verwenden Sie in NSUserDefaults einen Booleschen Wert

88

Wenn die rootViewControllermeiner Anwendung geladen ist, möchte ich überprüfen können, ob die Anmeldeinformationen des Benutzers gespeichert wurden oder nicht NSUserDefaults.

Wenn der Benutzer die Anwendung lädt und seine Anmeldeinformationen nicht gespeichert sind, modalAlertViewwird im Grunde genommen ein Push gesendet und der Benutzer kann seine Anmeldeinformationen entsprechend speichern. Dadurch werden diese UITextFieldZeichenfolgen in einem entsprechenden NSUserDefaultObjekt gespeichert. Ist es jedoch möglich, dass ich nach dem Speichern NSUserDefaultein boolesches Objekt erstellen und den Wert in "Ja" ändern kann?

Bedeutet dies, dass der Boolesche Wert bereits auf "Nein" gesetzt ist und der Benutzer beim Speichern seiner Anmeldeinformationen auch den Booleschen Wert in "Ja" ändert.

Sebastien Peek
quelle

Antworten:

263

Sie können Ihren Booleschen Wert festlegen, indem Sie Folgendes verwenden:

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

[[NSUserDefaults standardUserDefaults] synchronize];

und lesen Sie es mit diesem Code:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
    [self displayLogin];
} else {
    [self displayMainScreen];
}
Henrik P. Hessel
quelle
@ Henril P. Kann den gleichen Benutzer anzeigen, der zuvor angemeldet war
Ajay
10

Es gibt eine Methode in NSUserDefaultsaufgerufen registerDefaults:. Mit dieser Methode legen Sie die "Standardwerte" Ihrer Anwendung fest. Grundsätzlich erstellen Sie einen NSDictionarySchlüssel mit Ihren Standardschlüsseln und -werten (in Ihrem Fall ein NEIN für einen Schlüssel "Gespeicherte Anmeldeinformationen") und registrieren ihn mit registerDefaults:. Dies geschieht häufig in der + (void)initializeMethode des App-Delegaten, um sicherzustellen, dass Ihre Standardeinstellungen registriert werden, bevor sie benötigt werden. Diese Werte werden nur verwendet, wenn Ihre App sie nicht ersetzt hat. Mit anderen Worten, sie werden nur verwendet, wenn sich der gesuchte Schlüssel nicht in der Anwendungsdomäne befindet, dh der Benutzer liest standardmäßig aus der .plist-Datei des Benutzers.

Auf der anderen Seite können Sie einfach nach Anmeldeinformationen suchen und eine Warnung anzeigen, wenn diese fehlen. Dadurch entfällt die Notwendigkeit, Ihren Booleschen Wert mit den Anmeldeinformationen zu synchronisieren. Wenn Sie später die Funktion "Anmeldeinformationen löschen" bereitstellen, müssen Sie nicht daran denken, den Booleschen Wert auf NO zurückzusetzen. Wenn Ihre Anmeldeinformationen in den Standardeinstellungen des Benutzers gespeichert sind, gehen Sie folgendermaßen vor:

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
quelle
Wie würde ich eine Methode schreiben, die die Anmeldeinformationen überprüft und die Warnung nur anzeigt, wenn sie nicht gespeichert werden?
Sebastien Peek
4
Sie sollten nicht einmal daran denken, Kennwörter in NSUserDefaults zu speichern.
Krzysztof Przygoda
6

Diese von Henrik P. Hessel vorgeschlagene Lösung:

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

würde in Ihrem Fall funktionieren, aber denken Sie daran, dass Sie mit diesem Code nicht prüfen sollten, ob ein Schlüssel überhaupt gesetzt ist, denn wenn er tatsächlich gesetzt und auf "NEIN" gesetzt ist, würden Sie immer noch ein Ergebnis erhalten, als ob dies nicht der Fall wäre überhaupt eingestellt. Stattdessen würde ich verwenden

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

Sie müssen es nicht zuerst einstellen NO, sondern können überprüfen, ob überhaupt ein Schlüssel gesetzt wurde. Wenn nicht und wenn Ihre App feststellt, dass die Anmeldeinformationen vollständig sind, erstellen Sie sie einfach und setzen Sie sie auf YES.

Überprüfen Sie meine Antwort auf eine andere Frage, um zu sehen, wie ich das normalerweise mache.

Toastor
quelle
0

in Swift 3

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

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

alternativ können wir es object(forKey:)dann verwenden, um es zu boolen

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

Swift 2.3

Werte speichern

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

Zum Abrufen von Werten

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

Swift 3.0

Werte speichern

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

Werte abrufen

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