viewDidLoad()在prepareForSegue()之前调用完成:Swift

时间:2016-04-25 21:46:40

标签: ios swift model-view-controller uiviewcontroller segue

我有ContainerVC,其中包含变量controllerToLoad。默认情况下,它是" MainVC"但是,当单击菜单项时,我希望显示ContainerVC但不是加载MainVC,而是希望加载SecondVC。 我通过执行以下操作在ContainerVC的ViewDidLoad方法中加载MainVC:

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

我认为最好的方法是使用segue,所以我调用以下几行代码:

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

然后在我的prepareForSegue中,我执行以下操作:

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

出于某种原因,在致电performSegueWithIdentifier时,它会自动加载ContainerVC并开始将self.mainViewController设置为" MainVC"而不是等待prepareForSegue运行。我不知道为什么它不等prepareForSegue完成。

我通过添加一堆打印语句对此进行了测试。在self.performSegueWithIdentifier之前和secondViewController.controllerToLoad = "SecondVC"之前以及我ViewDidLoad的{​​{1}}之前。添加打印语句后,我意识到事实上只要调用ContainerVC,就会在调用performSegueWithIdentifier的{​​{1}}后立即执行

ViewDidLoad

2 个答案:

答案 0 :(得分:1)

这是正确且预期的行为。在prepareForSegue中,您可以访问destinationViewController及其属性,包括UIView元素,因此逻辑上必须已加载视图。因此,viewDidLoad将被调用。

你可以使用另一种方法,例如viewWillAppear,它在prepareForSegue之后执行,但似乎不同的方法会更好。也许是容器视图控制器上的一个方法,它告诉它加载并呈现一个新的VC。

答案 1 :(得分:0)

我认为,你不需要做这两件事。您实例化mainController,但是当您执行perfromSegue MainSegue时,会创建第二个mainController实例,并且您有错误的视图生命周期事件方法调用序列。你必须通过pushViewController推送mainController:动画或者根本不创建它。