更改rootviewcontroller后,swift导航控制器返回nil

时间:2017-05-29 14:38:18

标签: ios swift swift3 uinavigationcontroller

我试图更改我的应用程序的rootViewController,它运行正常。但是在更改rootViewController后,我的navigationController返回nil。因为这甚至我推送任何新控制器self.navigationController.pushViewController的简单代码都无法正常工作。

在此之前,我想解释为什么我要更改我的rootViewController。我是登录页面(初始视图控制器),成功登录后,用户将被重定向到UITabBarController(3个选项卡)。现在我想将rootViewController更改为这个UITabBarController,我用以下代码成功完成了。

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let destVC = self.storyboard?.instantiateViewController(withIdentifier: "home_view")
    let rootViewController = appDelegate.window?.rootViewController as! UINavigationController
    appDelegate.window?.rootViewController = destVC

现在,在更改rootViewController后,我的所有3个选项卡及其各自的视图控制器都工作正常。但是在我的一个视图控制器中我按下了按钮,然后单击该按钮,我想将新控制器推送给用户。现在我在这里遇到nil返回导航视图控制器的问题。

    let destVC = self.storyboard?.instantiateViewController(withIdentifier: "menu_items_view") as! MenuItems
    self.navigationController?.pushViewController(destVC, animated: true)

当我使用简单的上述代码时,没有任何反应。所有我能够调试的是我的self.navigationController返回nil。任何人都可以解释我在流程中的错误吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

您已从视图层次结构中删除了导航控制器。让我们看看你发布的代码:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let destVC = self.storyboard?.instantiateViewController(withIdentifier: "home_view")
let rootViewController = appDelegate.window?.rootViewController as! UINavigationController
// at this point your window's root view controller is a navigation controller.
appDelegate.window?.rootViewController = destVC
// In the above, you replaced the navigation controller with your destVC.

就像你穿上你的运动鞋穿上你的礼服鞋,然后你就会问为什么你的运动鞋不再在你的脚上了。

解决方案是将导航控制器放在标签栏控制器和需要导航控制器的视图控制器之间。

答案 1 :(得分:0)

答案非常简单,只需将您的“ destVC”放入UINavigationController中,如下所示:

let rootViewController = UINavigationController(rootViewController: destVC)
    UIApplication.shared.keyWindow?.rootViewController = rootViewController