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

Swift 在子视图中显示视图控制器,swift,uiview,uiviewcontroller,addsubview,Swift,Uiview,Uiviewcontroller,Addsubview,是否可以向UIView显示/添加视图控制器?如果是的话,请有人帮助我,因为我尝试了,但无法解决它。下面是我正在使用的当前代码。提前谢谢 if let keyWindow = UIApplication.shared.keyWindow { //container view let containerFrame = CGRect(x: 0, y: keyWindow.frame.height, width: keyWindow.frame.width, h

是否可以向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

    }
}

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

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


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

顺便说一句,如果您确实在进行视图控制器包含,并且要像ContainerView一样设置动画,你真的应该在动画的完成处理程序中执行didMove…啊,好的,谢谢Rob的解释。那么你的意思是不可能在keyWindow中向UIView添加一个视图控制器,对吗?我做了一个更狭义的断言,即如果你不进行视图控制器包含,就不应该进行视图包含调用,即addChild,didMove。如果执行包含,请将其添加为视图控制器视图的子视图。如果您真的必须使用keyWindow,请不要使用视图控制器控制。