Вы можете достичь этого несколькими способами.Использование блоков / замыканий, протоколов или, если вы используете RxSwift, чем использование управляемого свойства или использование контролируемых событий.Поскольку я не могу продемонстрировать все здесь, я собираюсь написать протокол
Используя протокол
Шаг 1:
Объявить протоколв вашем контроллере модального вида
@objc protocol ModalViewControllerProtocol {
func dismiss(with data: String)
}
Шаг 2:
ViewController, который представляет этот ModalViewController, делает его для подтверждения протокола
extension HomeViewController: ModalViewControllerProtocol {
func dismiss(with data: String) {
//use the data here
self.presentedViewController?.dismiss(animated: true, completion: nil)
}
}
Шаг 3:
Объявление переменной для хранения ссылки на делегат в ModalViewController
weak var delegate: ModalViewControllerProtocol? = nil
Шаг 4:
ВВаш ViewCOntroller, который представляет modalViewController, передает себя в качестве делегата ModalViewController перед представлением
let modalVC = //...
modalVC.delegate = self
self.present(modalVC, animated: true, completion: nil)
Наконец, в IBAction ModalViewController просто вызовите
@IBAction func apply_click(_ sender: Any) {
self.delegate?.dismiss(with: "your_data_here")
}
Использование блокировки / закрытия
Шаг 1:
В вашем модальном ViewController объявите свойство, которое принимает блокировку / закрытие
var completionBlock: (((String) -> ()))? = nil
Шаг 2:
В вашем ViewController, который представляет этот ModalViewController, передайте блок перед
let modalVC = //...
modalVC.completionBlock = {(data) in
debugPrint(data)
self.presentedViewController?.dismiss(animated: true, completion: nil)
}
self.present(modalVC, animated: true, completion: nil)
Шаг 3:
Наконец, в вашем ModalViewController IBAction просто выполните переданный блок
if let block = completionBlock {
block("your data here")
}
Надеюсь, это поможет