如何从IOS中的父视图控制器检测ViewDidDisappear

时间:2018-02-06 17:32:42

标签: ios swift

我知道我可以覆盖视图控制器中的ViewDidDisappear以检测它何时从内部调用,但如果我想在父控制器中调用一个函数,它就不干净了,因为我需要根据需要调用在父类上。 我想我在某处读到可以添加侦听器以从父级内部检测到,但我无法再找到它。 有人可以帮忙吗?

1 个答案:

答案 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)
  }