我有一个父视图控制器,通过子视图控制器的类方法插入子视图控制器。这个方法非常好用。
class func insertIntoController(parentController: UIViewController, parentView: UIView) -> VideoDoorbellLiveView? {
guard let liveViewController = parentController.storyboard?.instantiateViewControllerWithIdentifier(liveViewIdentifier) as? VideoDoorbellLiveView else { return nil }
liveViewController.view.translatesAutoresizingMaskIntoConstraints = false
parentController.addChildViewController(liveViewController)
parentView.addSubview(liveViewController.view)
let views = ["view": liveViewController.view]
var constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: views)
constraints.appendContentsOf(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]-0-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: views))
parentView.addConstraints(constraints)
liveViewController.didMoveToParentViewController(parentController)
return liveViewController
}
父级组件确保控制器存在并设置一些字符串变量等。非常好用。
guard let controller = VideoDoorbellLiveView.insertIntoController(self, parentView: liveView) else { return }
liveViewController = controller // liveViewController is an optional instance variable
我的问题是当父视图控制器(parentVC)消失时(deinit被调用),子视图控制器(child VC)的deinit没有被调用。
有什么想法吗?childVC中没有parentVC的引用。
我甚至尝试在parentVC中做了以下操作,但不能保证成功:
deinit {
if let liveViewController = liveViewController {
liveViewController.removeFromParentViewController()
}
}
liveViewController = controller
。你不应该保留第二个持久引用到你的子视图控制器。你已经有一个(在childViewControllers
数组中),这是你访问子视图控制器的唯一方式。至少,将此引用设置为弱引用,但最好根本不要保留它。 - matt