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