TabBarController在调用popToRootViewController()后保留其子控制器

时间:2019-06-06 12:47:48

标签: ios swift

我的根视图是一个带有3个标签的TabBarController:

    -> TabBarController  -> Tab1 (Login)  -> ViewController
                         -> Tab2          -> NavigationController1 -> ViewController1 (with TextField1) -> ViewController2
                         -> Tab3          -> NavigationController2 -> ViewController3 (with TextField2) -> ViewController4


注销时,我想要:
  1.使用Tab2和Tab3中的Textfield1和Textfield2中的数据销毁所有子控制器
  2.选择Tab1

我试图调用TabBarController的所有导航控制器的popToRootViewController(),然后,我在TabBarController中调用self.selectedIndex = 0。

    fileprivate func popAllNavigationControllersToRoot() {
        if let viewControllers = self.viewControllers {
            for viewController in viewControllers {
                if let navigationController = viewController as? UINavigationController {
                    navigationController.popToRootViewController(animated: false)
                }
            }
        }
    }

    @objc func onDidChangeLoginState(_ notification:Notification) {
        popAllNavigationControllersToRoot()
        self.selectedIndex = 0
    }


效果很好,但是当我在

onDidChangeLoginState(..)
之后重新登录并切换到Tab2或Tab3时,TextField1 / TextField2在调用onDidChangeLoginState(..)之前包含旧值。似乎在调用popToRootViewController时ViewControllers没有被破坏。我有什么问题吗?

我现在的最佳做法是

  LoginScreen -> TabBarController -> Tab1 ...
                                  -> Tab2 ...

但是Tab1内部的登录视图是由PO设置的。

2 个答案:

答案 0 :(得分:0)

由于TabBar控制器保留了视图控制器对象的内容,因此不会单独删除文本字段值。调用logout()时,您可以从两个选项卡中删除文本字段值并重置数据。另一种选择是,当用户登录时,“两个”选项卡中的文本字段值将设置为空字符串。

答案 1 :(得分:0)

  • 除非您另行通知,否则选项卡栏控制器将保留其视图控制器(ViewControllerNavigationController1NavigationController2。)

  • 除非您告诉他们这样做,否则两个导航控制器都将保留其根视图控制器(分别为ViewController1ViewController3)。

如果需要这些实例的新实例,可以重置整个堆栈,而不用弹出到根目录。例如:

let nav1 = tabBarController.viewControllers[1] as! UINavigationController
let newInstanceOfVC1 = ViewController1() // or initialize from storyboard

nav1.setViewControllers([newInstanceOfVC1], animated: true)