2017-03-24 12 views
1

こんにちは私の英語はあまり良くありません、私は事前にお詫び申し上げます。ViewController即時払いを却下

私のアプリケーションに問題があります。このシナリオは次のとおりです。自分のViewControllerコントローラに私のrootViewControllerが割り当てられています。私は2つのログインボタンと登録ボタンを持っている説明画面である他の画面を持っています。今

、私はログフルスクリーンフォーム上と私は却下送信するときの順序:

のViewController登録

self.dismiss(animated: false, completion: nil) 

そして隠されているすべての[OK]ビューが、だった前の画面に入るときユーザーがすでに存在する場合却下順序がある場合、私は検証を持って説明:

のViewController説明のApp

self.dismiss(animated: false, completion: nil) 

ただし、アクションは実行されません。

コード

のUIViewController

class ViewController: UIViewController { 

    override func viewDidLoad() { 

     FIRAuth.auth()!.addStateDidChangeListener() { auth, user in 
      if user == nil { 
       let descriptionController = DescriptionController() 
       present(descriptionController, animated: true, completion: nil) 
      } 

     } 
    } 
} 

DescriptionController

class DescriptionController: UIViewController { 

    @IBOutlet weak var sign_in_custom: UIButton! 

    override func viewDidLoad() { 

     FIRAuth.auth()!.addStateDidChangeListener() { auth, user in 
      if user != nil { 
       self.dismiss(animated: false, completion: nil) 
      } 

     } 

     sign_in_custom.addTarget(self, action: #selector(changeToSingIn), for: [.touchUpInside]) 
    } 

    func changeToSingIn() { 
     let singInController = SingInController() 
     present(singInController, animated: true, completion: nil) 
    } 
} 

SingInController

class SingInController: UIViewController { 
    @IBOutlet weak var sign_in_custom: UIButton! 
    override func viewDidLoad() { 
     sign_in_custom.addTarget(self, action: #selector(singIn), for: [.touchUpInside]) 
    } 
    func showLoad() { 
     let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert) 
     alert.view.tintColor = UIColor.black 
     let loadingIndicator: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(10, 5, 50, 50)) as UIActivityIndicatorView 
     loadingIndicator.hidesWhenStopped = true 
     loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray 
     loadingIndicator.startAnimating(); 
     alert.view.addSubview(loadingIndicator) 
     present(alert, animated: true, completion: nil) 
    } 
    func hideLoad() { 
     self.dismiss(animated: false, completion: nil) 
    } 
    func singIn() { 
     if (emailVarification()){ 
      if (passwordVarification()){ 
       showLoad() 
       guard let email = emailTextField.text else { return } 
       guard let password = passwordTextField.text else { return } 
       FIRAuth.auth()?.createUser(withEmail: email, password: password) { (user, error) in 
        hideLoad() 
        if (user != nil) { 
         self.dismiss(animated: false, completion: nil) 
        } else { 
         let alert = UIAlertController(title: "Error", message: "This is a error", preferredStyle: UIAlertControllerStyle.alert) 
         alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
         self.present(alert, animated: true, completion: nil) 
        } 
       } 
      } else { 
       let alert = UIAlertController(title: "Error", message: "This is a error", preferredStyle: UIAlertControllerStyle.alert) 
       alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
       self.present(alert, animated: true, completion: nil) 
      } 
     } else { 
      let alert = UIAlertController(title: "Error", message: "This is a error", preferredStyle: UIAlertControllerStyle.alert) 
      alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)) 
      self.present(alert, animated: true, completion: nil) 
     } 
    } 
} 

sequence

答えて

0

これは、第2コントローラが基本的に既存のコントローラの上に配置されているためです。最初のビューはまだ2番目のビューで実行されており、2番目のビューが閉じられると、最初のビューはViewDidLoadを呼び出しません。だから、それを解決するには、それをViewDidAppear関数の中に追加したいと思うでしょう。

+0

ありがとう助けてくれました –

1

ViewdidAppearにこのコードを使用します。

FIRAuth.auth()!.addStateDidChangeListener() { auth, user in 
     if user != nil { 
      self.dismiss(animated: false, completion: nil) 
     } 

    } 

    sign_in_custom.addTarget(self, action: #selector(changeToSingIn), for: [.touchUpInside]) 
+0

いい仕事です。それは私の仕事です。 –

0

代わりDescriptionControllerが自分自身を閉じたのではなく、ユーザーがサインインしても、いずれかを返したことのViewControllerを知らせることであろうために、より良い方法は次のようになり必要に応じてエラーを表示します。その後、ViewControllerは、成功または失敗したサインインに基づいて必要な追加ステップを実行できます。これはデリゲートパターンを使用することで実現できます(DescriptionControllerはプロトコルを定義し、ViewControllerはそれを実装します)。

関連する問題