在子视图中显示视图控制器

Posted

技术标签:

【中文标题】在子视图中显示视图控制器【英文标题】:Show view controller in a subview 【发布时间】:2019-01-04 15:37:49 【问题描述】:

是否可以向 UIView 显示/添加视图控制器?如果是的话,有人可以在我尝试时提供帮助,但我无法弄清楚。下面是我正在使用的当前代码。提前致谢

if let keyWindow = UIApplication.shared.keyWindow 

    //container view           
    let containerFrame  = CGRect(x: 0, y: keyWindow.frame.height, width: keyWindow.frame.width, height: 5)
    likesContainerView = UIView(frame: containerFrame)
    likesContainerView?.backgroundColor = UIColor.red
    keyWindow.addSubview(likesContainerView!)

    //likes view controller
    let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "likesVC") as! likeViewController
    vc.view.frame = (likesContainerView?.frame)!
    self.addChildViewController(vc)
    likesContainerView?.addSubview(vc.view) //crashes here!!
    vc.didMove(toParentViewController: self)


    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
        likesContainerView?.frame = CGRect(x: 0, y:10, width: keyWindow.frame.width, height:500)

    )  (_) in

    

【问题讨论】:

顺便说一句,如果你真的在做视图控制器包含并且要为likesContainerView 设置动画,你真的应该在动画的完成处理程序中做didMove... 【参考方案1】:

当您执行视图控制器包含(addChildaddSubviewdidMove)时,整个想法是将其添加为现有视图控制器中视图的子视图。这些调用的目的是确保您的视图层次结构与您的视图控制器层次结构保持同步。

但是您将 vc.view 添加为 likesContainerView 的子视图,您已将其添加为 keyWindow 的子视图。整个想法是视图控制器的视图可以具有由另一个视图控制器管理的子视图。

您的self 显然引用了一个视图控制器,因此如果您正在执行视图控制器包含,您应该将vc.view 添加为当前viewsubview,而不是直接添加到keyWindow

【讨论】:

好的,谢谢 Rob 的解释。那么你的意思是不可能在 keyWindow 内将视图控制器添加到 UIView 对吗? 我在做一个狭义的断言,即如果你不做视图控制器的遏制,你不应该做视图遏制调用(即addChilddidMove)。如果您进行遏制,请将其添加为视图控制器视图的子视图。如果你真的必须搞砸keyWindow,不要使用视图控制器包含。

以上是关于在子视图中显示视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

viewWithTag 在子视图控制器中总是返回 nil

在父视图控制器上注册一个 Segue 以在子视图控制器上使用

iPhone UIView:是不是可以仅在子视图上启用用户交互?

UIButton 在子视图控制器中不起作用

iOS - 在子视图的视图中添加一个按钮,但在顶视图的控制器上调用按钮的操作

使用 iOS 自动布局在子视图控制器与其父视图之间建立约束