我在应用中更改root时遇到问题。
我的应用程序的设计。
登录app后,我想将root vc更改为UITabBarViewController
以清理堆栈。
我遇到了多个问题。
在应用登录操作时将vc设置为标签栏 - >或者在底部vc:
self.performSegue(withIdentifier: "goToMainTabBar", sender: nil)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? TabBarViewController {
UIApplication.shared.keyWindow?.rootViewController = vc
}
}
该应用程序将崩溃:
Application tried to present modal view controller on itself. Presenting controller is TabBarViewController
下一个问题是,如果我们在TabBarViewController
viewDidLoaded
中设置了根。
UIApplication.shared.keyWindow?.rootViewController = self
UINavigationController
中嵌入的标签栏项目中没有自定义导航控制器,因此nav vc未实例化?因为我将进入项目vc孩子 - >我再也不能回来了。
如果我赢了;改变根vc那里一切都很好。
答案 0 :(得分:2)
对于1),您不能使用segue呈现视图控制器,然后使用它来替换准备中的根视图控制器。您需要从故事板中实例化选项卡视图控制器,然后替换根视图控制器。
这样的事情:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "TabController")
UIApplication.shared.keyWindow?.rootViewController = vc
(假设故事板被称为' Main'并且您为标签控制器提供了' TabController的故事板ID。
我对2的问题不太清楚。
然而,作为一般说明,我会采用不同的方式,而不是让登录控制器作为初始视图控制器将标签栏作为初始控制器,然后在应用程序第一次启动时显示登录控制器。这样你就可以完全避免更换根控制器了,而且它更加受控制。