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

dies ist der erste Controller meiner Demo, und in der Konsole genannt:UINavigationControllerDelegate der didShowViewController Verfahren wurde zweimal

sss 
showViewController 
showViewController 

die "didShowViewController" wurde zweimal genannt. Ich bin mir nicht sicher, was auf

----------------- einige Tests geht ------------------ ----

ich einige log in dieser Methode der Steuerung hinzu: Loadview, viewDidLoad, viewWillAppear, viewDidAppear, und die Reihenfolge dieser log ist:

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

Antwort

0

die UINavigationController hat angezeigt zwei Instanzen ein UIViewController

Von der UINavigationControllerDelegate documentation

Wird aufgerufen, nachdem der Navigationscontroller eine Ansicht des Controllers angezeigt hat.

Statt logging „showViewController“, die UIViewController Instanz anmelden, um zu sehen, was

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

danke, hatte ich versucht, Ihre vorschlagen, in Konsole, druckt es die gleiche Instanz zweimal –

+1

warum wird die Methode zweimal aufgerufen? @James Zaghini –

1

vor sich geht, wenn Sie den viewDidLoad(..) der Klasse UIViewController überschreiben, sollten Sie immer auch die super.viewDidLoad(), oder Sie könnten unerwartete erhalten Verhalten (zum Beispiel ein view-Controller einmal zweimal gezeigt werden, wenn zu erwarten ist).

Versuchen Hinzufügen super.viewDidLoad() zu Ihrem override viewDidLoad(...):

override func viewDidLoad() { 
    super.viewDidLoad() 

    // delegates 
    navigationController!.delegate = self 
} 

Sie Ihre Log noch Ihre View-Controller zeigen wird zweimal gezeigt?

+0

ja, noch zweimal –

+1

Haben Sie jemals herausfinden, warum dies geschieht? – SAHM

0

schlug ich das gleiche Problem in meinem Code. Ich konnte es umgehen, indem ich bis viewDidAppear wartete, um den Navigationsdelegaten festzulegen, anstatt es in viewDidLoad festzulegen. Zu übersetzen, um es zu Ihrem Beispiel:

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

// ... 

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