具体解决方案
假设这是你的MainViewController
class MainViewController: UIViewController {
func foo() {
print("foo")
}
}
你可以像这样声明你的SecondViewController
class SecondViewController: UIViewController {
@IBAction func didTapDismiss(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
let mainViewController = self.presentingViewController as? MainViewController
super.dismiss(animated: flag) {
mainViewController?.foo()
completion?()
}
}
}
如您所见,一旦 SecondViewController 被解除,mainViewController?.foo() 方法就会被调用。
一般解决方案
让我们定义MainViewController
class MainViewController: UIViewController {
typealias CallBack = () -> Void
func foo() {
print("foo")
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let mainViewControllerCallbackProtocol = segue.destination as? MainViewControllerCallbackProtocol {
mainViewControllerCallbackProtocol.mainViewControllerCallback = { [weak self] in
self?.foo()
}
}
}
}
还有自己的回调协议
protocol MainViewControllerCallbackProtocol:AnyObject {
var mainViewControllerCallback: MainViewController.CallBack? { get set }
}
最后让我们将SecondViewController 统一为MainViewControllerCallbackProtocol
class SecondViewController: UIViewController, MainViewControllerCallbackProtocol {
var mainViewControllerCallback: MainViewController.CallBack?
@IBAction func didTapDismiss(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag) { [weak self] in
self?.mainViewControllerCallback?()
completion?()
}
}
}