如何在ContainerViewController中切换childViewControllers(加载一个新的,“删除”旧的)

时间:2017-02-25 23:35:46

标签: ios swift uiviewcontroller

好的,这就是我的计划(我还没有完成): 我希望container ViewController拥有3个ViewControllers

  1. InfoVC :顶部的小“信息”部分
  2. MenuVC :一个菜单(位于InfoVC的view下方),用于选择要在ContentVC中显示的页面
  3. ContentVC ViewControllers代表不同的网页(例如OverviewContentVCMessagesContentVC,...)
  4. InfoVC MenuVC 应始终保持静态。他们不会改变。 但是当您在MenuVC.view内选择一个页面时, ContentVC 应该加载相应的内容ViewController。这意味着,它需要删除/取消当前内容ViewController(并将其从container ViewController中移除)并将其替换为新内容。

    我不知道该怎么做。

    以下是我对此的一些看法。如果有人可以帮助我,我真的很感激。也许我的方法不太正确。

    首先,我会将contentVC作为属性添加到我的Container View Controller

    var contentVC: UIViewController?
    

    然后,在某些方法(例如viewDidLoad)中,我会将contentVC添加为子项:

    contentVC = OverviewContenVC() // default VC
    self.addChildViewController(contentVC!)
    contentVC!.view.frame = ...
    self.view.addSubview(contentVC!.view)
    contentVC!.didMove(toParentViewController: self)
    

    现在,用户点击菜单并希望转到MessagesContentVC。这是我的想法:

    contentVC!.removeFromParentViewController()
    contentVC!.view.removeFromSuperview()
    contentVC = MessagesContentVC() // does this deinit OverviewContentVC?
    
    // Do the same steps as above to add the new childVC
    

    显然,我可以将这两个代码片段组合在一起,并将它们合并为一个method。这只是为了表明我的想法。

    另外,你可以做各种动画。

    但我不确定这是否是可接受的解决方案。例如,如果MessagesContentVC需要几秒钟才能加载(这会很糟糕,但会怎样),该怎么办?也许我可以把这段代码放到后台线程中?

    感谢您的帮助!

0 个答案:

没有答案