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 }