我有一个 UIViewController (DetailViewController),它由顶部的导航栏和覆盖屏幕其余部分的 UIView 组成。是否可以使用 DetailViewController 以外的 UIViewController 来控制 UIView?
问问题
5829 次
3 回答
8
你可以这样做,但你不能忘记调用 Apple 嵌入 UIViewControllers 所需的方法。否则,您的视图控制器将不会被操作系统调用来处理某些事件。
添加视图控制器:
[self addChildViewController:childViewController];
[self.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];
要删除视图控制器:
[childViewController willMoveToParentViewController:nil];
[childViewController.view removeFromSuperview];
[childViewController removeFromParentViewController];
相关文档:
- 在 UIViewController 类参考中实现一个容器视图控制器
- iOS 视图控制器编程指南中的实现容器视图控制器
有关更多信息,请参阅此问题。
于 2014-06-16T04:21:48.887 回答
1
您也可以在情节提要中完成所有这些操作。只需将容器视图拖出到您的主视图控制器中,然后使用从它的嵌入到您的嵌入式视图控制器。它将为您正确设置所有视图控制器层次结构。
于 2014-06-16T04:27:13.723 回答
0
在 Swift 5.3 中,您可以使用以下扩展:
extension UIViewController {
/// Embeds a UIViewController inside of another UIViewController using its view.
/// - Parameters:
/// - Parameter viewController: UIViewController to embed
/// - Parameter frame: A frame to be used. Nil by default and used view's frame.
func embed(viewController: UIViewController, frame: CGRect? = nil) {
addChild(viewController)
view.addSubview(viewController.view)
viewController.view.frame = view.bounds
viewController.didMove(toParent: self)
}
/// Removes an embedded UIViewController from a UIVIewController
/// - Parameters:
/// - Parameter embeddedViewController: UIViewController to remove
func remove(embeddedViewController: UIViewController) {
guard children.contains(embeddedViewController) else {
return
}
embeddedViewController.willMove(toParent: nil)
embeddedViewController.view.removeFromSuperview()
embeddedViewController.removeFromParent()
}
}
于 2020-10-03T16:31:24.687 回答