【问题标题】:Change root View Controller更改根视图控制器
【发布时间】:2018-01-01 22:12:21
【问题描述】:

在我的应用中更改根目录时遇到问题。

我的应用程序的设计。 登录应用程序后,我想将 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
        }
    }
    

应用程序将崩溃:

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

    UIApplication.shared.keyWindow?.rootViewController = self

UINavigationController 中嵌入的标签栏项目本身没有导航控制器,所以导航 vc 没有实例化?因为我什么时候会进入项目 vc child -> 我不能再回来了。 如果我不会;不更改根 vc,那么一切都很好。

【问题讨论】:

  • @Ercell0 我不这么认为,你读过我的 2 个问题吗?
  • 是的,我做到了,也许你应该继续阅读这个问题,你需要将你的 VC 嵌入 UINavigationController 然后将其添加为根 VC:.rootViewController = UINavigationController(rootViewController: tabVC)

标签: ios swift


【解决方案1】:

对于 1) 您不能使用 segue 呈现视图控制器,然后使用它来替换准备中的根视图控制器。您需要从情节提要中实例化选项卡视图控制器,然后替换根视图控制器。

类似这样的:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "TabController")
UIApplication.shared.keyWindow?.rootViewController = vc

(假设情节提要名为“Main”,并且您为选项卡控制器提供情节提要 ID“TabController”。

我不太清楚 2 的问题是什么。

但是,作为一般说明,我会以不同的方式处理此问题,而不是将登录控制器作为初始视图控制器,而是将选项卡栏作为初始控制器,然后在应用程序第一次启动时显示登录控制器。这样一来,您就可以完全避免更换根控制器,并且更加可控。

【讨论】:

  • 感谢您的解决方案。我会按照你说的去做。
猜你喜欢
  • 2012-07-26
  • 2017-03-09
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多