2017-08-07 1 views
0

Der Code unten funktioniert, aber jetzt, wenn ich die Login-Taste drücken, Zugriff es mir automatisch zu meinem nächsten View-Controller, aber ich will das nicht. Ich möchte abgemeldet bleiben, bis die korrekten Informationen eingegeben wurden. Ich glaube, das Problem ist, wenn ich die Storyboard und Appdelegate Informationen vor dem Login-Code eingeben. Irgendwelche Vorschläge, wie ich das umstrukturieren würde? oder ein mehr kondensieren Code?Eine erfolgreiche Anmeldung

@IBAction func loginButton(_ sender: Any) { 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let tabBarController = storyboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    appDelegate.window?.rootViewController = tabBarController 




    let loginName = userNameField.text; 
    let loginLast = userLastField.text; 

    let loginNameStored = UserDefaults.standard.string(forKey: "loginName"); 

    let loginLastStored = UserDefaults.standard.string(forKey: "loginLast"); 

    if(loginNameStored == loginName) 
    { 
     if(loginLastStored == loginLast) 
     { 

      //login is successful 

      UserDefaults.standard.set(true, forKey:"isUserLoggedIn"); 
      UserDefaults.standard.synchronize(); 
      self.dismiss(animated: true, completion:nil) 
     } 
    } 
+0

In diesem Code zuerst setzen Sie einen rootViewController und überprüfen isUserLoggedIn, oder? . eigentlich verstehe ich nicht, was du wirklich willst, kannst du es erklären –

+0

@MidhunKMohan Die Idee ist, sobald ein Benutzer erfolgreich ihren Benutzernamen und Passwort eingegeben hat, klicken sie auf den Login-Button und es wird sie zu einer Ansicht, die einen Tab hat Regler. Mein Problem ist, wenn ich auf den Login-Button klicke, schickt er mich automatisch zur nächsten View, ohne eine Login-Formation einzugeben. – William

Antwort

1

Bitte versuchen Sie es. Ich denke das Problem ist zuerst, dass Sie die rootviewController ohne Bedingung einstellen. Es führt Sie zum nächsten ViewController. Sie möchten auch die textFieldisEmpty überprüfen oder nicht.

@IBAction func loginButton(_ sender: Any) { 

let loginName = userNameField.text; 
let loginLast = userLastField.text; 

let loginNameStored = UserDefaults.standard.string(forKey: "loginName"); 

let loginLastStored = UserDefaults.standard.string(forKey: "loginLast"); 

if(loginNameStored == loginName) && (loginLastStored == loginLast) 
{ 
     //login is successful 

     UserDefaults.standard.set(true, forKey:"isUserLoggedIn"); 
     UserDefaults.standard.synchronize(); 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let tabBarController = storyboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     appDelegate.window?.rootViewController = tabBarController 
} 
+0

Ja, das hat 100% funktioniert! Vielen Dank. – William

0

Ihre beste Wette wäre, um Ihren Login-Setter in eine Abschluss-Block-Methode zu platzieren und Ihre dismiss Methode im Abschluss Block zu rufen. Wie so:

UPDATE: Stellen Sie sicher, zu überprüfen, ob die textFields Null sind.

@IBAction func loginButton(_ sender: Any) {  
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let tabBarController = storyboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    appDelegate.window?.rootViewController = tabBarController 

    guard let loginName = userNameField.text, let loginLast = userLastField.text else { return } 

    let loginNameStored = UserDefaults.standard.string(forKey: "loginName"); 

    let loginLastStored = UserDefaults.standard.string(forKey: "loginLast"); 



    if(loginNameStored == loginName) 
    { 
     if(loginLastStored == loginLast) 
     { 
      //login is successful 
      appplySetters({ 
       self.dismiss(animated: true, completion:nil) 
      }) 
      return 
     } 
    } 
} 

func applySetters(_ completion: @escaping(()->())) {  
    UserDefaults.standard.set(true, forKey:"isUserLoggedIn") 
    if UserDefaults.standard.synchronize() { 
     completion() // test synchronize here.. it acts as a proper delaying condition before calling completion. 
    } 
} 

-Code innerhalb der Fertigstellung Blöcke wird nur dann ausgeführt, wenn ihre escaping Parameter in ihren Funktionen aufgerufen werden. In diesem Fall heißt dieser Parameter completion.

+0

Alles sieht gut aus, aber die Zeile "applySetters ({" es gibt eine Fehlermeldung "Verwendung der lokalen Variablen" applySters 'vor der Deklaration " – William

+0

vergessen, eine Klammer hinzuzufügen .. Update überprüfen – murphguy

+0

Fehlende Klammer war die Lösung, aber ich kann immer noch drücken die Login - Schaltfläche zur nächsten Ansicht ohne Benutzer/Passwort .... sollte ich einen Breakpoint hinzufügen? – William

Verwandte Themen