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

這是我的演示的第一控制器,並在控制檯:UINavigationControllerDelegate的didShowViewController方法被調用兩次

sss 
showViewController 
showViewController 

的「didShowViewController」被稱爲兩次。 我不確定發生了什麼

----------------- some test ------------------ ----

我在控制器的這些方法中添加一些日誌:的loadView,viewDidLoad中,viewWillAppear中,viewDidAppear,和這些日誌的順序是:

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

回答

0

UINavigationController顯示的兩個一UIViewController的實例

來自UINavigationControllerDelegate documentation

在導航控制器顯示一個視圖之後調用 控制器的視圖和導航項目屬性。

相反日誌「showViewController」的,登錄UIViewController實例,看看發生了什麼事情

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

謝謝你,我試過你的建議, 控制檯 ,它打印相同的實例兩次 –

+1

爲什麼被稱爲兩次的方法? @James Zaghini –

1

當重寫UIViewController類的viewDidLoad(..),你應該總是包括super.viewDidLoad(),或者你可能會得到意想不到的行爲(例如,一旦預期視圖控制器顯示兩次)。

嘗試增加super.viewDidLoad()override viewDidLoad(...)

override func viewDidLoad() { 
    super.viewDidLoad() 

    // delegates 
    navigationController!.delegate = self 
} 

做你的日誌仍然顯示正在顯示兩次您的視圖控制器?

+0

是的,還是兩次 –

+1

你有沒有想過爲什麼會發生這種情況? – SAHM

0

我在我的代碼中遇到同樣的問題。我可以等到viewDidAppear來設置導航代理,而不是將它設置在viewDidLoad中。翻譯成你的例子:

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

// ... 

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