С iOS 13.0 и выше Apple изменила способ представления контроллеров представления по умолчанию. Таким образом, viewWillAppear в ViewControllerA не будет вызываться после исчезновения ViewControllerB.
Один способ убедиться, что метод viewWillAppear будет вызван после закрытия ViewControllerB, представляет параметр viewController modalPresentationStyle для fullScreen как:
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ViewControllerB") as! ViewControllerB
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)
Пример кода:
ViewControllerA.swift
class ViewControllerA: UIViewController {
private var username: String? {
UserDefaults.standard.string(forKey: "USERNAME")
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print(username) //set this to desired view
}
@IBAction func goToViewControllerB(_ sender: UIButton) {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ViewControllerB") as! ViewControllerB
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)
}
}
ViewControllerB.swift
class ViewControllerB: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults.standard.set("John", forKey: "USERNAME")
}
@IBAction func dismiss(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
}
Если вы не хотите изменять modalPresentationStyle на fullScreen, то вы можете использовать замыкания для передачи данных в ViewControllerA при отклонении ViewControllerB.