这是我有一段时间没有遇到的老问题了,但我现在重新审视它并需要一些帮助。我正在使用 UIKit 和 Storyboards 开发一个 iOS 应用程序,我遇到了一个问题,即在选项卡之间切换时,前一个选项卡的 UINavigationController 堆栈中的视图在 UI 中保持可见,即使它们不应该显示。
问题: 选项卡 1:我在第一个选项卡内有一个 UINavigationController。在这个导航控制器中,我将多个视图控制器推送到导航堆栈上,创建视图“堆栈”。 选项卡 2:我有另一个带有自己的 UINavigationController 的选项卡。当我从选项卡 1 切换到选项卡 2 时,之前的导航堆栈(来自选项卡 1)仍然可见,导致新选项卡的根视图控制器无法正确显示。 目标: 我希望在选项卡之间平滑切换,确保当我从一个选项卡切换到另一个选项卡时,前一个选项卡的导航堆栈中的视图被清除。转换看起来应该是无缝的,新选项卡的 UINavigationController 从其根视图控制器处理导航。
设置: 我使用 Storyboards 来设置视图。 我正在使用 UITabBarController 的自定义子类来管理选项卡栏逻辑。 每个选项卡都有自己的 UINavigationController 作为根视图控制器。 为了更好地理解图表:
Tab 1 (with UINavigationController)
+---------------------------------------------------------+
| Root ViewController |
| +--------------------------------+ |
| | VC 1 | |
| +--------------------------------+ |
| | VC 2 | |
| +--------------------------------+ |
| | VC 3 | |
| +--------------------------------+ |
+---------------------------------------------------------+
Tab 2 (with UINavigationController)
+---------------------------------------------------------+
| Root ViewController |
| +--------------------------------+ |
| | VC A | |
| +--------------------------------+ |
| | VC B | |
| +--------------------------------+ |
+---------------------------------------------------------+
我需要什么: 当我从选项卡 1(堆栈顶部有 VC 3)切换到选项卡 2 时,我希望删除选项卡 1 的 UINavigationController 中的视图,并且希望从选项卡 2 的导航控制器的根视图控制器开始。
我的尝试: 我尝试在选择选项卡时使用 popToRootViewController(animated: true) ,但这并不能按预期工作,因为导航堆栈没有足够快地清除以进行转换,而且我仍然看到以前的视图。
问题: 如何确保在切换选项卡时清除先前的导航堆栈,以便新选项卡显示其根视图控制器,而不会出现旧选项卡中的任何残留视图? 如何才能让选项卡切换平滑自然,感觉像是选项卡之间的正确过渡?
预期行为: 切换选项卡时,应删除前一个选项卡的视图控制器(在 UINavigationController 堆栈中)。 新选项卡应显示其根视图控制器,而没有任何先前从旧选项卡推送的视图。
切换选项卡时,应删除前一个选项卡的视图控制器(在 UINavigationController 堆栈中)。 新选项卡应显示其根视图控制器,而没有任何先前从旧选项卡推送的视图。
这应该可以做到:
class MyTabBarController: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Set the delegate to self so we can use delegate methods
self.delegate = self
}
// Delegate method called when a tab is selected
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
// if the selected tab holds a UINavigationController
if let vc = viewController as? UINavigationController {
// pop to the root controller of that navigation controller
vc.popToRootViewController(animated: false)
}
}
}
当选择一个选项卡时,我们检查该选项卡的视图控制器是否是
UINavigationController
...如果是,我们告诉它弹出到其根控制器,使用 animated: false