Ios 在UITabBarController中按下ViewController

Ios 在UITabBarController中按下ViewController,ios,swift,uiviewcontroller,uinavigationcontroller,uitabbarcontroller,Ios,Swift,Uiviewcontroller,Uinavigationcontroller,Uitabbarcontroller,我有一个一般性问题:我已经在我的应用程序中设置了一个选项卡。当我单击项目1时,选项卡栏显示嵌入NavigationController中的ViewController(VC 1)。当用户注销时(使用firebase和addStateDidChangeListener),该VC应该推送另一个VC(VC 2)。它工作得很好:当我注销VC1时,按下VC2。但是,当我再次单击选项卡栏上的项目1时。你猜怎么着?我可以在没有用户的情况下看到VC1。我想我不得不以某种方式放弃VC 1,但我不知道如何实现这个功

我有一个一般性问题:我已经在我的应用程序中设置了一个
选项卡。当我单击项目1时,选项卡栏显示嵌入
NavigationController
中的
ViewController
(VC 1)。当用户注销时(使用firebase和
addStateDidChangeListener
),该VC应该推送另一个VC(VC 2)。它工作得很好:当我注销VC1时,按下VC2。但是,当我再次单击选项卡栏上的项目1时。你猜怎么着?我可以在没有用户的情况下看到VC1。我想我不得不以某种方式放弃VC 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
}

您可以覆盖窗口根视图控制器和新选项卡栏控制器。因此,在未来的新开发(新的屏幕层次结构)中,您不会有任何bug


有点不清楚。你能更好地解释一下吗?你在VC1上试过self.disclose吗?无论你在哪里打电话离开VC1,VC1都应该被解除,只要你没有返回到它,那么VC2应该出现。你能显示一些代码吗?可能是如何加载选项卡栏和导航控制器。但一般来说,如果不使用,就不需要在堆栈中使用view controller。它对我不起作用,因为我的选项卡栏中的项目1图像消失了,我现在有了黑屏。我已尝试更改“删除”和“插入”位置(例如从0更改为1),但结果相同。在我单击“注销”按钮并出现以下错误之前,该操作一直在工作:由于未捕获的异常“NSInternalInconsistencyException”终止应用程序,原因是:“导航控制器中不允许使用UINavigationController!”我现在对VC1中的TableView有一个问题。似乎找不到数据源:隐式展开可选值时意外发现nil致命错误:隐式展开可选值(lldb)时意外发现nil@RajeshKumar R启动应用程序时,我已经注销;当我单击选项卡栏中的项目时,应用程序崩溃。我可以看到VC2,但是看起来VC1的数据源有一个错误…奇怪…事实上我们就快到了。它几乎在工作。当我启动应用程序并已登录时,VC 1显示。当我注销时,VC2显示。非常好!但是当我再次登录时。VC 1不显示
    //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