更改根视图控制器

时间:2018-01-01 22:12:21

标签: ios swift

我在应用中更改root时遇到问题。

enter image description here

我的应用程序的设计。 登录app后,我想将root vc更改为UITabBarViewController以清理堆栈。

我遇到了多个问题。

  1. 在应用登录操作时将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
        }
    }
    
  2. 该应用程序将崩溃:

    Application tried to present modal view controller on itself. Presenting controller is TabBarViewController
    
    1. 下一个问题是,如果我们在TabBarViewController viewDidLoaded中设置了根。

      UIApplication.shared.keyWindow?.rootViewController = self

    2. UINavigationController中嵌入的标签栏项目中没有自定义导航控制器,因此nav vc未实例化?因为我将进入项目vc孩子 - >我再也不能回来了。 如果我赢了;改变根vc那里一切都很好。

1 个答案:

答案 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的问题不太清楚。

然而,作为一般说明,我会采用不同的方式,而不是让登录控制器作为初始视图控制器将标签栏作为初始控制器,然后在应用程序第一次启动时显示登录控制器。这样你就可以完全避免更换根控制器了,而且它更加受控制。