在另一个中“嵌入” UIViewController

Posted

技术标签:

【中文标题】在另一个中“嵌入” UIViewController【英文标题】:"Embed" UIViewController within another 【发布时间】:2012-05-30 00:49:48 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

添加视图控制器:

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

移除视图控制器:

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

相关文档:

Implementing a Container View Controller 在 UIViewController 类参考中 Implementing a Container View Controller 在 ios 视图控制器编程指南中

更多信息请参见this question。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

在 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()
    

【讨论】:

以上是关于在另一个中“嵌入” UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

在另一个站点中嵌入 doxygen 文档?

在另一个视图中嵌入共享图标

mysql - 在另一个查询中嵌入计数查询

在另一个自定义 UIView 中嵌入自定义 UITableViewCell?

嵌入在另一个标签助手代码中的标签助手不呈现

如何为嵌入在另一个堆栈视图中的堆栈视图设置顶部布局约束?