В настоящее время я создаю приложение, которое использует UINavigationController для экранных переходов.
Проблема, с которой я столкнулся, заключалась в том, что строка печати в методе делегата willShow на экране B не будет отображаться. Переход от экрана A к B к A метод делегата willShow будет вызываться правильно, и даже если он отображается в консоли, переход от экрана A к B к C к B к A приведет к тому, что метод для него не будет вызывается и не будет отображаться.
ViewController.swift
// First view
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Home"
}
}
SecondViewController.swift
class SecondViewController: UIViewController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.delegate = self
navigationItem.title = "Second"
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if let _ = viewController as? SecondViewController {
print("=====(open)willShow::SecondViewController=====")
} else {
print("=====(close)willShow::SecondViewController=====")
}
}
}
ThirdViewController.swift
class ThirdViewController: UIViewController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.delegate = self
navigationItem.title = "Third"
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if let _ = viewController as? ThirdViewController {
print("=====(open)willShow::ThirdViewController=====")
} else {
print("=====(close)willShow::ThirdViewController=====")
}
}
}
Журналы перехода от экрана A к B к A
=====(open)willShow::SecondViewController=====
=====(close)willShow::SecondViewController=====
Журналы перехода от экрана A к B к C к B к A
=====(open)willShow::SecondViewController=====
=====(open)willShow::ThirdViewController=====
=====(close)willShow::ThirdViewController=====
По логике вы должны увидеть это сообщение в конце.
=====(close)willShow::SecondViewController=====
FirstViewController
SecondViewController
ThirdViewController