2016-04-25 24 views
1

私はに変数controllerToLoadを保持しています。デフォルトでは「MainVC」ですが、メニュー項目をクリックするときにはContainerVCを表示しますが、MainVCをロードする代わりにSecondVCをロードします。 私は次の操作を行って、私のContainerVCのviewDidLoadメソッドでMainVCをロード:viewDidLoad()prepareForSegue()の前に呼び出される終了:Swift

if let controller = self.storyboard?.instantiateViewControllerWithIdentifier(controllerToLoad) { 
    self.mainViewController = controller 
} 

私はこれを行うための最善の方法は、セグエであるので、私は次のコード行を呼び出すと思った:

self.performSegueWithIdentifier("MenuSegue", sender: self) 

はその後、私のprepareForSegueに、私は次のようにします。performSegueWithIdentifierを呼び出すとき

if (segue.identifier == "MenuSegue"){ 
    let secondViewController = segue.destinationViewController as! ContainerViewController 
    secondViewController.controllerToLoad = "SecondVC" 
} 

何らかの理由で、それは自動的に012をロードしますとprepareForSegueが実行されるのを待つ代わりにself.mainViewControllerを "MainVC"に設定し始めます。私はprepareForSegueが完了するのを待たない理由を知らない。

私は、印刷文の束を追加してこれをテストしました。 self.performSegueWithIdentifierの直前、secondViewController.controllerToLoad = "SecondVC"の前、ViewDidLoadの私のContainerVCの前。実際には、すぐperformSegueWithIdentifierが、それは、その後ContainerVCViewDidLoadを呼び出した直後に、と呼ばれるよう

let secondViewController = segue.destinationViewController as! ContainerViewController secondViewController.controllerToLoad = "SecondVC"

答えて

1

これは正しく、予想される動作です。 prepareForSegueでは、destinationViewControllerとそのプロパティ(UIView要素を含む)にアクセスできるので、論理的にはビューが既にロードされている必要があります。したがって、viewDidLoadが呼び出されます。

prepareForSegueの後に実行するviewWillAppearのような別の方法を使用することもできますが、別の方法が適しているようです。おそらく、新しいVCをロードして提示するように指示したコンテナビューコントローラのメソッドです。

+0

そうです、あなたは正しいです。私は自分のContainerVCコードを取り出し、self.mainViewControllerを私が渡す変数に設定するメソッドに入れました。素晴らしいヒント! –

0

を実行することを私が実現print文を追加した後、私が思うに、あなたは両方のこれらの事をする必要はありません。 mainControllerをインスタンス化しますが、MainSegueをperfromSegueするとmainControllerの2番目のインスタンスが作成され、間違ったビューライフサイクルイベントのメソッド呼び出しシーケンスが発生します。あなたは、mainControllerをpushViewControllerによってプッシュする必要があります:アニメーション化するか、まったく作成しないでください。

関連する問題