El método didViewViewController de UINavigationControllerDelegate se llamó dos veces

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) } } 

este es el primer controller de mi demo y en la console:

 sss showViewController showViewController 

el "didShowViewController" se llamó dos veces. No estoy seguro de lo que está pasando.

—————– alguna testing ———————-

Agrego un poco de logging en este método de controller: loadView, viewDidLoad, viewWillAppear, viewDidAppear, y el order de estos loggings es:

 loadView viewDidLoad viewWillAppear will:<NaviDemo.ViewController: 0x7fe8c9533050> <NaviDemo.ViewController: 0x7fe8c9533050> viewDidAppear <NaviDemo.ViewController: 0x7fe8c9533050> 

Al anular la viewDidLoad(..) de la class UIViewController , siempre debe include el super.viewDidLoad() , o puede get un comportamiento inesperado (p. Ej., Un controller de vista que se muestra dos veces cuando se espera una vez).

Intente agregar super.viewDidLoad() a su vista de override viewDidLoad(...) :

 override func viewDidLoad() { super.viewDidLoad() // delegates navigationController!.delegate = self } 

¿Su logging aún muestra el controller de vista que se muestra dos veces?

UINavigationController ha mostrado dos instancias de UIViewController

De la documentation UINavigationControllerDelegate

Se llama justo después de que el controller de navigation muestre las properties de visualización y elemento de navigation de un controller de visualización.

En lugar de registrar "showViewController", registre la instancia de UIViewController para ver qué está sucediendo.

 func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { print(viewController) }