2015-12-25 17 views
8
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) 
     } 
} 

questo è il primo controller del mio demo, e in consolle:metodo didShowViewController di UINavigationControllerDelegate è stato chiamato due volte

sss 
showViewController 
showViewController 

il "didShowViewController" è stato chiamato due volte. Non so cosa sta succedendo

----------------- alcuni test ------------------ ----

aggiungo un po 'di log in queste modalità di controllo: loadview, viewDidLoad, viewWillAppear, viewDidAppear, e l'ordine di questi log è:

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

risposta

0

I UINavigationController ha mostrate due istanze di un UIViewController

dal UINavigationControllerDelegate documentation

Chiamato subito dopo che il controller di navigazione visualizza una vista del controllore e le proprietà dell'oggetto di navigazione .

Invece di registrazione "showViewController", accedere l'istanza UIViewController per vedere cosa sta succedendo

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

grazie, avevo cercato il tuo suggeriscono, in consolle, stampa la stessa istanza due volte –

+1

perché è il metodo chiamato due volte? @James Zaghini –

1

Quando l'override del viewDidLoad(..) della classe UIViewController, si deve sempre includere la super.viewDidLoad(), o si potrebbe ottenere inaspettato comportamento (ad esempio, un controller di visualizzazione viene mostrato due volte quando una volta è previsto).

Prova ad aggiungere al vostro super.viewDidLoad()override viewDidLoad(...):

override func viewDidLoad() { 
    super.viewDidLoad() 

    // delegates 
    navigationController!.delegate = self 
} 

Fate il vostro log mostrano ancora il vostro controller della vista viene mostrato due volte?

+0

sì, ancora due volte –

+1

Hai mai capito perché questo stava accadendo? – SAHM

0

Ho riscontrato lo stesso problema nel mio codice. Sono stato in grado di aggirare il problema aspettando fino al viewDidAppear per impostare il delegato di navigazione invece di impostarlo in viewDidLoad. Da tradurre al tuo esempio:

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

// ... 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    navigationController!.delegate = self 
} 
Problemi correlati