在 UITabBarController 中推送 ViewController

Posted

技术标签:

【中文标题】在 UITabBarController 中推送 ViewController【英文标题】:Push ViewController in UITabBarController 【发布时间】: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 和你的导航控制器。但一般来说,如果你不使用它,你不需要堆栈中的视图控制器。 【参考方案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

【讨论】:

以上是关于在 UITabBarController 中推送 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

在 UITabBarController 中推送 ViewController

从 UITabBarController 推送的 UISplitViewController

如何在 uitabbarcontroller 中的 uibutton 单击事件上推送其他视图控制器?

从嵌套在 UITabBarController 中的导航控制器推送视图控制器?

在 UITabbarController 上推送 UIViewController 的问题

在推送的 UITabBarController 上设置徽章