从父母删除子查看控制器时,应用程序会崩溃



我正在尝试测试UIViewControllers之间的某些动画,在这种情况下,我有一个UIViewController,它添加了另一个UIVC作为其子视图。

一切都按预期工作,添加和呈现孩子的视图,然后在孩子视图上,我有一个UINavigationBar,该CC_4具有取消按钮(解散)作为左栏按钮。

当我单击该按钮时,我触发了一个函数,该功能试图从视图层次结构(从其父视图中)删除此呈现的子视图。

来自父视图的代码:

    // ViewController -> Parent
lazy var presentButton: UIButton = {
    let b = UIButton(type: .custom)
    b.setTitle("Present", for: .normal)
    b.setTitleColor(.black, for: .normal)
    b.addTarget(self, action: #selector(didTapPresentButton), for: .touchUpInside)
    return b
}()
lazy var childViewController: PresentedViewController = {
    let viewController = PresentedViewController()
    return viewController
}()

@objc func didTapPresentButton() {
    addViewControllerAsChildViewController(childViewController: childViewController)    
}

func addViewControllerAsChildViewController(childViewController: UIViewController) {
    self.addChildViewController(childViewController)
    childViewController.view.frame = CGRect.zero
    self.view.addSubview(childViewController.view)
    let newFrame = view.bounds
    UIView.animate(withDuration: 2) {
        childViewController.view.frame = newFrame
    }
    childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    childViewController.didMove(toParentViewController: self)
}

如您在上面看到的,当我单击现在的按钮时,它会实例化孩子的视图并将其动画化,到目前为止很好。

儿童查看代码:

// ChildViewController -> Child (ofc)
@objc func didTapCancel() {
    self.willMove(toParentViewController: nil)
    self.view.removeFromSuperview()
    self.removeFromParentViewController()
}

现在在子视图上,当我单击取消按钮时,我知道我必须调用removeFromParentViewController()才能正确删除,但是如果我使用以下G错误执行此操作,则该应用程序会崩溃:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[dismissLayerTest.ChildViewController name]: unrecognized selector sent to instance 0x7fea2f60a920'

然后我尝试评论self.removeFromParentViewController()行,然后这样做,该应用不会崩溃,但是在父级视图控制器上,我可以看到该视图仍然通过打印self.childViewControllers.count附加到其父1

您可以看到问题在哪里吗?

谢谢

我弄清楚问题在哪里。

经过一些测试,我发现使用parent-child View Controllers时我们不应使用lazy的实例。

由于i试图从parentViewController删除lazy时,i将childViewController实例化为CC_12解雇,因为它失去了参考。

为了修复它,我删除了lazy的实例,因此它始终保持范围,现在我可以成功地将孩子从父母范围中删除。

var childViewController: ChildViewController = {
    let viewController = ChildViewController()
    return viewController
}()

最新更新