我知道我可以覆盖视图控制器中的ViewDidDisappear
以检测它何时从内部调用,但如果我想在父控制器中调用一个函数,它就不干净了,因为我需要根据需要调用在父类上。
我想我在某处读到可以添加侦听器以从父级内部检测到,但我无法再找到它。
有人可以帮忙吗?
答案 0 :(得分:2)
有很多方法可以解决这个问题。一种可能性是在ChildViewController
上创建委托协议。
protocol ChildViewControllerDelegate: class {
func notifyParent(sender: ChildViewController)
}
您还可以在delegate
上创建ChildViewController
var,如下所示:
weak var delegate: ChildViewControllerDelegate?
在ParentViewController
上,您可以按照以下方式进行操作:
performSegue(withIdentifier: "MySegue", sender: self)
在prepareForSegue
中,你有类似的内容:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MySegue" {
let destinationViewController = segue.destination as! ChildViewController
destinationViewController.delegate = self
}
}
同样在ParentViewController
上,您执行协议,如下所示:
extension ParentViewController: ChildViewControllerDelegate {
func notifyParent(sender: ChildViewController) {
print("Do Whatcha Gotta Do")
}
}
然后,无论何时解雇ChildViewController
,只需在dismiss
的完成块中调用委托方法,如下所示:
dismiss(animated: true) {
self.delegate?.notifyParent(sender: self)
}
例如,您可以在IBAction
内部使用解雇代码,如下所示:
@IBAction func closeButtonAction(_ sender: UIButton) {
dismiss(animated: true) {
self.delegate?.notifyParent(sender: self)
}
}
...或者,如果您以另一种方式解除ChildViewController
,则可以执行viewDidDisappear
,如下所示:
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(true)
delegate?.notifyParent(sender: self)
}