2017-08-07 160 views
0

下面的代碼工作,但現在當我按下登錄按鈕,它會自動訪問我到我的下一個視圖控制器,但我不想這樣。我想保持註銷狀態,直到輸入正確的信息。我相信這個問題是當我在登錄代碼之前輸入故事板和Appdelegate信息的時候。任何關於我如何重組的建議?或更濃縮的代碼?一個成功的登錄

@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

在這段代碼中,首先你要設置rootViewController並檢查isUserLoggedIn,對不對? 。其實我不明白你真正想要什麼,你可以解釋它 –

+0

@MidhunKMohan想法是,一旦用戶成功地輸入了他們的用戶名和密碼,他們點擊登錄按鈕,它會帶他們到一個視圖,有一個標籤控制器。我的問題是,當我點擊登錄按鈕時,它會自動將我發送到下一個視圖,而無需輸入任何登錄信息。 – William

回答

1

請嘗試。我認爲問題首先是你沒有任何條件設置rootviewController。它引導你到下一個viewController。你也想檢查textFieldisEmpty或不。

@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

是的,這100%的工作!謝謝。 – William

0

你最好的選擇將是把你登錄到setter方法完成塊法,並呼籲結束塊內的dismiss方法。像這樣:

UPDATE:確保檢查textFields是否爲零。完成塊的內部

@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. 
    } 
} 

代碼時其escaping參數被稱爲其功能的內部時,纔會執行。在這種情況下,該參數被稱爲completion

+0

一切看起來不錯,但行「applySetters({」它返回一個錯誤,說「使用局部變量applySetters'之前它聲明」 – William

+0

忘了添加一個支架..檢查更新 – murphguy

+0

失蹤支架是解決方案,但我仍然可以推登錄按鈕到下一個視圖沒有任何用戶/密碼....我應該添加一個斷點? – William