我有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
答案 0 :(得分:1)
这是正确且预期的行为。在prepareForSegue
中,您可以访问destinationViewController
及其属性,包括UIView元素,因此逻辑上必须已加载视图。因此,viewDidLoad
将被调用。
你可以使用另一种方法,例如viewWillAppear
,它在prepareForSegue
之后执行,但似乎不同的方法会更好。也许是容器视图控制器上的一个方法,它告诉它加载并呈现一个新的VC。
答案 1 :(得分:0)
我认为,你不需要做这两件事。您实例化mainController,但是当您执行perfromSegue MainSegue时,会创建第二个mainController实例,并且您有错误的视图生命周期事件方法调用序列。你必须通过pushViewController推送mainController:动画或者根本不创建它。