2017-08-12 13 views
1

ユーザがログインすると終了するビューコントローラがあります。終了機能終了ブロックでは、次のView Controllerをリロードする関数を起動しました。何も起こらない、空のビューコントローラ。しかし、すでにログインしているときにアプリケーションを終了してから再度開くと、すべてがロードされるようにロードされます。だからここ解除完了ブロックで機能が起動されない

は私のログイン機能である:

func loginFunc() { 

     if emailField.text != "" && passwordField.text != "" { 

      Auth.auth().signIn(withEmail: emailField.text!, password: passwordField.text!, completion: { (user, error) in 

       if user != nil { 
        // Sign In Successful 
        print("Sign In Sucessful") 
        self.dismiss(animated: true, completion: { 
         self.mainVC.starterMethod() 
        }) 
       } else { 

        if let myError = error?.localizedDescription { 
         print(myError) 
        } else { 
         print("Error") 
        } 

       } 

      }) 

     } 

    } 

そして、ここで私のstarterMethod()

func starterMethod() { 

     ref = Database.database().reference() 

     let userId = Auth.auth().currentUser?.uid 

     if userId != nil { 
      print("You are logged in...") 
     } else { 
      present(LoginController(), animated: true, completion: nil) 
     } 

     setupPicks() 
     setupViewsMed() 
     fetchGames() 
     setNavigationBar() 
     setupCircles() 

    } 

starterMethod()viewDidLoad

に呼ばれて、私は本当に可能な場合viewDidAppear()を避けたいです

+0

あなたの 'completionBlock'はエスケープしていますか?そうであればメモリリークがあります(それは悪いですが、自己がメモリに保持され、 'mainVC'へのアクセス権を持っているのでうまくいくはずです。@escapingでなければ、間違いなくUIがフリーズしてしまいます任意のメモリリークが発生しますが、完了ハンドラを終了した後に自己は存在しません。したがって、mainVCは存在しません。 – farzadshbfn

+0

通知を使用することもできます。通知を送信し、MainVCにオブザーバを追加する – farzadshbfn

+0

@farzadshbfn通知とオブザーバをどのように実装するのですか?もう少しお手伝いしてください:) –

答えて

1

私はDelegateメソッドがあなたに最も適していると思います。解約されたView Controllerは、View Controllerのプレゼンテーションに通知する必要があるためです。

Appleのドキュメント。それが提示ビューコントローラを却下する時間が来ると

は、 好ましいアプローチは提示ビューコントローラがそれを を却下させることです。言い換えれば、可能であれば、 がビューコントローラを提示したのと同じビューコントローラが、 をディスミュートする責任を負います。 提示コントローラに提示されたビューコントローラが を却下すべきであることを通知するためのいくつかの手法があるが、好ましい手法は委任である。私はあなたが表示されている現在のクラスで作成しmainVC (self.mainVC)のインスタンスを持っていると仮定することができ、コードから

self.dismiss(animated: true, completion: { 
    self.mainVC.starterMethod() 
}) 

下記のコードから

0

現在のビューが解読された後、おそらくmainVCの参照が失われて問題が発生している可能性があります。

ソリューション:

あなたがメインのVCでのイベントに耳を傾けるために、デリゲートメソッドや通知を使用することができます。あなたの現在のビューコントローラ @protocolのLoginDoneProtocol { FUNC loginAndDismissed() } にプロトコル以下、これを作成する必要が

Class mainVC : UIViewCOntroller , LoginDoneProtocol { 
} 

のようにあなたがデリゲートを実装することができ、あなたのmainVCにおけるプロトコルに確認し、あなたのmainVC内で、デリゲートメソッド内でメソッドを呼び出して値をリセットします。

func loginAndDismissed(){ 
    starterMethod() 
} 

あなたのViewController却下あなたは単に

self.dismiss(animated: true, completion: { 

delegate.loginAndDismissed() 

}) 

注意を呼び出すことができますあなたの現在のビューコントローラが提示されたときにあなたのmainVCから現在のビューコントローラにデリゲートを割り当てる必要があります。

デリゲートの作成方法に関するチュートリアルが多数あります。

0

私は解決策を見つけ出すことができました。私はそれが最も簡単なアプローチであり、非常に信頼できると思います。

まず第一に、私は定数を宣言:

let LOGGED_IN_NOTIFICATION = NSNotification.Name("LoggedInNotification") 

その後、私は追加dismissメソッド完了ブロックで:

NotificationCenter.default.post(name: LOGGED_IN_NOTIFICATION, object: nil) 

そして最後にはmainVC's viewDidLoad方法で

override func viewDidLoad() { 
    super.viewDidLoad() 

     NotificationCenter.default.addObserver(forName: LOGGED_IN_NOTIFICATION, object: nil, queue: nil) { 
      notification in 

      print("Logged in") 

      self.reset() 

      self.starterMethod() 

     } 

    self.starterMethod() 

} 
をオブザーバーを追加しました
関連する問題