2016-11-11 10 views
1

私のアプリでは、「メイン」ViewControllerがあります。そのviewDidAppearの体内でのアプリの起動時に、私はUserDefaults booleanの値を取得します。これは、モーダルAuthViewControllerを起動UIViewControllerメソッドをUIViewControllerから深く入れ子にして呼び出す

self.performSegue(withIdentifier:"loginView", sender:self) 

、含まれているのViewController:ユーザーがログインしていない場合、私は別のviewcontrollerモーダルこの方法を提示します"Container View"、UIPageViewControllerAuthPageViewController)を含むAuthViewControllerの領域。

この最後のページには、2つの「ページ」:LoginViewControllerRegisterViewControllerがあります。

More than a thousand words

LoginViewControllerユーザーをログインするために使用されます。ユーザーは、私がメインViewController上の機能(それが何をするかに関係なく)を呼び出したいに記録された後。

したがって、要約すると、私はLoginViewControllerにあり、ViewControllerというメソッドを呼び出したいと思います。

ソリューションをしようとしている間、私は、次を発見した:

  • LoginViewControllerはViewControllerをから直接開かれていなかったので、私はpresentingViewControllerへの参照を取得することはできません。さらに、AuthViewControllerpresent(_:animated:completion:)で開始されていませんでしたが、前に述べたようにself.performSegueで開始されました。
  • ViewControllerLoginViewControllerからインスタンス化し、メソッドを呼び出すことは有効ですが、それは良い考えではありません。
  • NSNotificationはチャームのように機能します。
  • このアプリケーションのコンテストでは、デリゲートが機能していないか、実装について何か不足しているようです。

LoginViewControllerからViewControllerメソッドを呼び出す方法を理解できますか?コード例は非常によく受け取りましたが、私は助言に感謝します。

+2

デリゲートからgoToContentを呼び出すことができます'ViewController'から 'LoginViewController'を呼び出すだけで、それ以外の場合は通知を使います。同時に複数のメッセージを閉じると、unwindは動作します。 – Tj3n

答えて

1

あなたはこの

protocol LoginViewControllerDelegate: class { 
    func goToContent(animated:Bool) 
} 

ようLoginViewControllerにデリゲートを作成する必要があります

まず、この

のようにデリゲートのための変数を作成し、私はこのケースでは、デリゲートを使用する方法のコードでそれを説明してみましょう
weak var delegate: LoginViewControllerDelegate? 

今ではViewControllerのようにdelegateをこのように割り当てる必要があります。prepareforsegueあなたはこのように、この

func goToContent(animated: Bool) { 
    print("test") 
} 

のようにその方法をこの

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "yourSegueIdentifier" { 
     let nextScene = segue.destination as! LoginViewController 
     nextScene.delegate = self 
    } 
} 

ようセグエを使用して実装されているような方法は、あなたがinitの場合は動作しますLoginViewController

+0

ありがとう、ありがとう!私は同じ結果を達成するために、よりエレガントでない別の方法を見つけました:prepareForSegueで、目的のviewcontrollerにプロパティを設定し、それを自分自身に渡しました。私がLoginViewControllerからそれを必要とするとき、私は親の "連鎖"を通してそれに到達します。私はそれが好きではなかったが、それは働いた。 :-) –

+0

そういう風にもできますが、一度この解決策を試してみてください – Rajat

+1

ちょっと待ってください:Rajat:ViewControllerはLoginViewControllerのSegueを実際には用意していませんが、 "granpa" AuthViewController –

関連する問題