UINavigationControllerDelegate的didShowViewController方法被调用了两次

bel*_*ian 12 uinavigationcontroller ios swift

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)
      }
}
Run Code Online (Sandbox Code Playgroud)

这是我演示的第一个控制器,在控制台中:

sss
showViewController
showViewController
Run Code Online (Sandbox Code Playgroud)

两次调用"didShowViewController".我不确定发生了什么

-----------------一些测试----------------------

我在控制器的这些方法中添加了一些日志:loadView,viewDidLoad,viewWillAppear,viewDidAppear,这些日志的顺序是:

loadView
viewDidLoad
viewWillAppear
will:<NaviDemo.ViewController: 0x7fe8c9533050>
<NaviDemo.ViewController: 0x7fe8c9533050>
viewDidAppear
<NaviDemo.ViewController: 0x7fe8c9533050>
Run Code Online (Sandbox Code Playgroud)

Jam*_*ini 0

显示UINavigationController了 a 的两个实例UIViewController

\n\n

UINavigationControllerDelegate文档中

\n\n
\n

在导航控制器显示视图\n控制器\xe2\x80\x99s视图和导航项属性后调用。

\n
\n\n

不要记录“showViewController”,而是记录UIViewController实例以查看发生了什么

\n\n
func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {\n     print(viewController)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 为什么该方法被调用两次?@詹姆斯·扎吉尼 (3认同)