Ios 如何从容器视图中删除UIViewController?

Ios 如何从容器视图中删除UIViewController?,ios,swift,Ios,Swift,这就是我所做的。添加部件正在工作,但删除部件不工作: extension UIViewController { func add(_ child: UIViewController, containerView: UIView) { addChildViewController(child) containerView.addSubview(child.view) child.didMove(toParentViewController:

这就是我所做的。添加部件正在工作,但删除部件不工作:

extension UIViewController {
    func add(_ child: UIViewController, containerView: UIView) {
        addChildViewController(child)
        containerView.addSubview(child.view)
        child.didMove(toParentViewController: self)
    }

    func remove(containerView: UIView) {
        guard parent != nil else { return }

        willMove(toParentViewController: nil)
        removeFromParentViewController()
        containerView.removeFromSuperview()
    }
}
我试图更新这段代码,这段代码最初会添加和删除子视图控制器。但我想要的是从容器视图中添加和删除


有人能指出删除部分有什么问题吗?

< P>最好从孩子而不是父母

考虑。
func remove() {
   willMove(toParentViewController: nil)
   view.removeFromSuperview()
   removeFromParentViewController()
}
//


您的
添加
删除
应该从同一个角度出发。在这两种情况下,
self
应该是父视图控制器,或者在这两种情况下,
self
应该是子视图控制器。现在,您似乎将
add
self
作为父项,将
remove
self
作为子项

这是您的扩展,其中
self
是这两个方面的子项:

extension UIViewController {
    func add(_ parent: UIViewController) {
        parent.addChildViewController(self)
        parent.view.addSubview(view)
        didMove(toParentViewController: parent)
    }

    func remove() {
        guard parent != nil else { return }

        willMove(toParentViewController: nil)
        removeFromParentViewController()
        view.removeFromSuperview()
    }
}

缺少的唯一一项是在将子视图控制器的视图添加到父控制器后设置其
帧。在调用
Add
后添加这样一行,或者在
Add
中添加一个框架作为第二个参数
Add
remove
都应该有一个参数-正在添加或删除的视图控制器。好的,那么我如何告诉它从容器视图中删除它呢?不是自我观点?你的意图是什么?是对包含的(父)视图控制器还是包含的(子)视图控制器调用
remove
?我认为是包含的。我希望从容器视图中删除添加的vc。如果对子级调用了
remove
,则对子级调用
add
,并且
add
的唯一参数应该是父视图控制器。我不知怎的对这将如何工作感到困惑…我将容器视图作为参数发送?或者我需要添加的视图控制器?因为看起来我需要发送容器视图。您可以在子(包含的)视图控制器上调用
add
remove
。在
add
的情况下,传递父(包含)视图控制器
remove
与您使用的相同,但已修复以正确删除子视图。谢谢,它;他现在在工作。我被所有这些孩子和家长搞糊涂了。在你的问题中保持添加不变,从家长那里添加,用这个答案替换删除,从孩子那里添加
extension UIViewController {
    func add(_ parent: UIViewController) {
        parent.addChildViewController(self)
        parent.view.addSubview(view)
        didMove(toParentViewController: parent)
    }

    func remove() {
        guard parent != nil else { return }

        willMove(toParentViewController: nil)
        removeFromParentViewController()
        view.removeFromSuperview()
    }
}