【问题标题】:Push ViewController in UITabBarController在 UITabBarController 中推送 ViewController
【发布时间】:2019-05-30 13:36:24
【问题描述】:

我有一个一般性问题:我在我的应用程序中设置了TabBar。当我单击第 1 项时,TabBar 显示嵌入在 NavigationController 中的 ViewController (VC 1)。当用户注销时(使用 firebase 和 addStateDidChangeListener),该 VC 应该推送另一个 VC(VC 2)。效果很好:当我注销 VC1 时,推送 VC 2。但是,当我再次单击选项卡栏上的项目 1 时。你猜怎么了?没有用户时我可以看到 VC 1。我想我必须以某种方式解雇 VC 1,但我不知道如何实现这个功能。你能帮帮我吗?

【问题讨论】:

  • 有点不清楚。你能解释清楚吗?
  • 你在 VC1 上试过 self.dismiss 吗?在任何你打电话离开 VC1 的地方调用它,然后 vc1 应该被解雇,只要你不继续回到它,那么 VC2 应该出现
  • 你能显示一些代码吗?也许你如何加载你的 TabBar 和你的导航控制器。但一般来说,如果你不使用它,你不需要堆栈中的视图控制器。

标签: ios swift uiviewcontroller uinavigationcontroller uitabbarcontroller


【解决方案1】:

在导航控制器中更改视图控制器

当点击注销按钮时,从导航控制器中移除 VC1 并添加 VC2

if var viewControllers = self.navigationController?.viewControllers {
    viewControllers.removeLast()
    viewControllers.append(VC2())
    self.navigationController?.setViewControllers(viewControllers, animated: true)
}

VC2 再次登录时,再次更改视图控制器

self.navigationController?.setViewControllers([VC1()], animated: true)

在标签栏控制器中更改视图控制器

退出

if var viewControllers = self.tabBarController?.viewControllers {
    let newVC = UINavigationController(rootViewController: VC2())
    newVC.tabBarItem = UITabBarItem(title: "Log In", image: nil, tag: 0)
    viewControllers.removeFirst()
    viewControllers.insert(newVC, at: 0)
    self.tabBarController?.viewControllers = viewControllers
}

登录

if var viewControllers = self.tabBarController?.viewControllers {
    let newVC = UINavigationController(rootViewController: VC1())
    newVC.tabBarItem = UITabBarItem(title: "Home", image: nil, tag: 0)
    viewControllers.removeFirst()
    viewControllers.insert(newVC, at: 0)
    self.tabBarController?.viewControllers = viewControllers
}

【讨论】:

  • 这对我不起作用,因为我的标签栏中的项目 1 图像消失了,我现在有黑屏。我尝试更改删除和插入位置(例如从 0 到 1),但结果相同。
  • 它一直在工作,直到我单击注销按钮并出现以下错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“导航控制器中不允许使用 UINavigationControllers!”跨度>
  • 我现在在 VC1 中的 TableView 有问题。似乎它没有找到 DataSource:Unexpectedly found nil while implicitly unwrapping an Optional value 致命错误:Unexpectedly found nil while implicitly unwrapping an Optional value (lldb)
  • @RajeshKumar R 当我启动应用程序时,我已经退出了;当我单击 TabBar 中的项目时,应用程序崩溃。我可以看到 VC2 但似乎 VC 1 的 DataSource 有错误..奇怪...
  • 事实上我们快到了。它几乎可以工作了。当我启动应用程序并且我已经登录时,会显示 VC 1。当我注销时,VC2 显示。很好!但是当我再次登录时。 VC 1 不显示
【解决方案2】:

您可以覆盖窗口 rootviewcontroller 新的标签栏控制器。因此,将来您不会遇到任何新开发(新屏幕层次结构)的错误。

    //Login
    let navigation = UINavigationController.init(rootViewController: vc1)
    let tabVC = UITabBarController()
    tabVC.viewControllers?.append(navigation)
    self.appDelegate?.window?.rootViewController = navigation

    //Logout
    let navigation = UINavigationController.init(rootViewController: vc2)
    let tabVC = UITabBarController()
    tabVC.viewControllers?.append(navigation)
    self.appDelegate?.window?.rootViewController = navigation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多