我正在尝试制作一个自定义的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。那里有一个更好的模型。
答案 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