UINavigationControllerDelegate的didShowViewController方法被调用了两次
class ViewController: UIViewController, UINavigationControllerDelegate { override func viewDidLoad() { super.viewDidLoad() navigationController!.delegate = self } func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { print("showViewController") } func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { print("sss") } func update() { let vc = SecondViewController() navigationController!.pushViewController(vc, animated: true) } }
这是我演示的第一个控制器,在控制台中:
sss showViewController showViewController
两次调用“didShowViewController”。 我不确定发生了什么事
—————–一些测试———————-
我在控制器的这些方法中添加了一些日志:loadView,viewDidLoad,viewWillAppear,viewDidAppear,这些日志的顺序是:
loadView viewDidLoad viewWillAppear will: viewDidAppear
覆盖UIViewController
类的viewDidLoad(..)
时,应始终包含super.viewDidLoad()
,否则可能会出现意外行为(例如,视图控制器在预期一次时显示两次)。
尝试将super.viewDidLoad()
添加到override viewDidLoad(...)
:
override func viewDidLoad() { super.viewDidLoad() // delegates navigationController!.delegate = self }
您的日志是否仍然显示您的视图控制器显示两次?
UINavigationController
显示了UIViewController
两个实例
来自UINavigationControllerDelegate
文档
在导航控制器显示视图控制器的视图和导航项属性后调用。
而不是记录“showViewController”,记录UIViewController
实例以查看正在发生的事情
func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { print(viewController) }
我在我的代码中遇到了同样的问题。 我可以通过等待viewDidAppear
设置导航委托而不是在viewDidLoad
中设置它来解决它。 要将其翻译为您的示例:
override func viewDidLoad() { super.viewDidLoad() } // ... override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) navigationController!.delegate = self }