我正在尝试测试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
}()