Конкретное решение
Допустим, это ваш 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?()
}
}
}