“嵌入”UIViewController在另一个内

时间:2012-05-30 00:49:49

标签: ios uiview uiviewcontroller

我有一个UIViewController(DetailViewController),它包含一个顶部的导航栏和一个覆盖屏幕其余部分的UIView。是否可以使用除DetailViewController以外的UIViewController来控制UIView?

3 个答案:

答案 0 :(得分:8)

您可以这样做,但是您不能忘记调用Apple所需的嵌入UIViewControllers的方法。否则,操作系统不会调用您的视图控制器来处理某些事件。

添加视图控制器:

[self addChildViewController:childViewController];                 
[self.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];

删除视图控制器:

[childViewController willMoveToParentViewController:nil];  
[childViewController.view removeFromSuperview];            
[childViewController removeFromParentViewController];

相关文档:

有关详细信息,请参阅this question

答案 1 :(得分:0)

您也可以在故事板中完成所有这些操作。只需将容器视图拖到主视图控制器中,然后使用嵌入的segue嵌入到视图控制器中。它将为您正确设置所有视图控制器层次结构。

答案 2 :(得分: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()
    }
}