我的根视图是一个带有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设置的。
答案 0 :(得分:0)
由于TabBar控制器保留了视图控制器对象的内容,因此不会单独删除文本字段值。调用logout()
时,您可以从两个选项卡中删除文本字段值并重置数据。另一种选择是,当用户登录时,“两个”选项卡中的文本字段值将设置为空字符串。
答案 1 :(得分:0)
除非您另行通知,否则选项卡栏控制器将保留其视图控制器(ViewController
,NavigationController1
和NavigationController2
。)
除非您告诉他们这样做,否则两个导航控制器都将保留其根视图控制器(分别为ViewController1
和ViewController3
)。
如果需要这些实例的新实例,可以重置整个堆栈,而不用弹出到根目录。例如:
let nav1 = tabBarController.viewControllers[1] as! UINavigationController
let newInstanceOfVC1 = ViewController1() // or initialize from storyboard
nav1.setViewControllers([newInstanceOfVC1], animated: true)