【问题标题】:viewDidLoad() Getting Called Before prepareForSegue() Finishes: SwiftviewDidLoad() 在 prepareForSegue() 完成之前被调用:Swift
【发布时间】:2016-08-19 11:57:33
【问题描述】:

我有一个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" 之前以及我的ContainerVCViewDidLoad 之前。添加打印语句后,我意识到实际上只要调用performSegueWithIdentifier,就在它调用ViewDidLoadContainerVC 然后执行

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,你是对的。我将我的 ContainerVC 代码放入一个方法中,该方法将 self.mainViewController 设置为我传递的变量。很好的提示!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 2014-07-16
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多