在 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 中的导航控制器推送视图控制器?