我有一个ContainerVC,它包含一个变量controllerToLoad。默认情况下,它是"MainVC“,但是当单击菜单项时,我希望显示ContainerVC,但不加载MainVC,而是加载SecondVC。通过执行以下操作,我在我的MainVC的ViewDidLoad方法中加载了ContainerVC:
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 of my ContainerVC。在添加了print语句之后,我意识到实际上在调用performSegueWithIdentifier之后,在调用ViewDidLoad of ContainerVC之后立即执行
let secondViewController = segue.destinationViewController as! ContainerViewController    secondViewController.controllerToLoad = "SecondVC"
发布于 2016-04-25 22:03:20
这是正确的行为,也是人们期待的行为。在prepareForSegue中,您可以访问destinationViewController及其属性,包括UIView元素,因此逻辑上视图必须已经加载。因此,将调用viewDidLoad。
您可以使用另一种方法,例如viewWillAppear,它在prepareForSegue之后执行,但似乎另一种方法更好。也许是容器视图控制器上的一种方法,它告诉它加载并呈现一个新的VC。
https://stackoverflow.com/questions/36851656
复制相似问题