2017-08-07 21 views
0

以下のコードは動作しますが、ログインボタンを押すと自動的に次のView Controllerにアクセスしますが、私はそれを望んでいません。正しい情報が入力されるまでログアウトしておきたい。問題は、ログインコードの前にストーリーボードと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

あなたの最善の策は完了ブロック法にログインセッターを配置するために、完了ブロック内でごdismissメソッドを呼び出すことであろう。同様に:

更新textFieldsがnilであることを確認してください。そのescapingパラメータがその関数内呼び出されたときに完了ブロックの内部

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

コードのみが実行されます。この場合、このパラメータはcompletionと呼ばれます。

+0

すべてがうまく見えますが、 "applySetters({"それは宣言の前にローカル変数 'applySetters'を使用するというエラーを返しています " – William

+0

ブラケットを追加するのを忘れています... check update – murphguy

+0

ブラケットがありませんでしたが、ユーザ/パスワードなしの次のビューへのログインボタン....ブレークポイントを追加する必要がありますか? – William

関連する問題