是否可以在不使用addChildViewController的情况下将UIViewController嵌套在另一个中?

时间:2018-01-31 00:01:30

标签: ios swift uiviewcontroller uiscrollview uicontainerview

我正在尝试制作一个自定义的ContainerViewController,但是由于ViewController过渡的许多困难并使一切都互动,我决定自己模仿这个功能。

我基本上想要做的是,在顶部控件上有一个分页UIScrollView(HeaderView),下面是另一个包含ViewControllers作为页面的UIScrollView(ControllersView),以便在您滑动到HeaderView上的新页面,它还会滑动到ControllersView上的下一个viewcontroller。 This is what the setup would look like.

我的问题是,上述设置有什么问题吗?我要做的就是将视图控制器添加到ControllersView就像:controllersView.addSubview(pagecontroller1.view)

网上的一些帖子似乎说“不会调用相应的ViewController函数”或其他什么。我在这里似乎缺少什么?我猜这里有很多解雇和承认ViewControllers,每次ViewController不在框架之前我需要调用它吗?

澄清问题:这样做是否正常/有效?当VC进入和退出帧时,我应该调用一些viewWillAppear / disapper函数吗?如果是这样,我该怎么称呼?我意识到如果我以这种方式设置,我需要管理很多通常自动处理的东西,但正如我之前提到的,自定义ContainerViewControllers已经失败了,我将继续使用它。

PS。如果您似乎仍然对此情况感到迷茫,请参阅我之前想要使用Container ViewController的问题here。那里有一个更好的模型。

1 个答案:

答案 0 :(得分:0)

您可以添加和删除VC容器视图

For - 执行此操作是否正常/有效?当VC进入和离开帧时,我应该调用一些viewWillAppear / disapper函数吗?如果是这样,我该怎么称呼?

因为,我们需要在添加和删除VC时调用WillAppear和Disappear Func,因此尝试使用以下将处理这些响应的函数

我使用两个特定的函数在UIView里面的ScrollView中的ContainerView / UIView / SubView中添加和删除Controller

添加

private func add(asChildViewController viewController: UIViewController)
{
    // Configure Child View
    viewController.view.frame = CGRect(x: 0, y: 0, width: self.firstContainer.frame.size.width, height: self.firstContainer.frame.size.height)

    // Add Child View Controller
    addChildViewController(viewController)
    viewController.view.translatesAutoresizingMaskIntoConstraints = true

    // Add Child View as Subview
    firstContainer.addSubview(viewController.view)

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

要删除

private func remove(asChildViewController viewController: UIViewController)
{
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    secondContainer.willRemoveSubview(viewController.view)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

创建对象

private lazy var FirstObject: firstVC =
  {
    // Instantiate View Controller
    let viewController = self.storyboard?.instantiateViewController(withIdentifier: "firstVC") as! firstVC

    // Add View Controller as Child View Controller
    self.addChildViewController(viewController)
    return viewController
  }()

For - controllersView.addSubview(pagecontroller1.view)

答案 - 是如果未将pagecontroller1加载到内存堆栈中,则不会调用Approbate func,要加载您需要通知pagecontroller1它将作为子视图添加到内存堆栈,就像我们启动一个控制器和基本上通知Controller将其组件加载到内存堆栈以获取一些内存分配

问题 - 在不使用addChildViewController的情况下将UIViewController嵌套在另一个内是否可以?

检查Apple文档 - https://developer.apple.com/documentation/uikit/uiviewcontroller/1621394-addchildviewcontroller

这是必要的,以便通知将在另一个父视图中添加为孩子的控制器

示例项目

https://github.com/RockinGarg/Container_Views.git

https://github.com/RockinGarg/ContainerView-TabBar.git

如果问题仍然没有得到解答请告诉我你想要自己完成的Func