如何在具有嵌套 UINavigationController 的选项卡之间平滑切换,并从 UIKit 中的堆栈中删除以前的视图? (老问题但重新审视)

问题描述 投票:0回答:1

这是我有一段时间没有遇到的老问题了,但我现在重新审视它并需要一些帮助。我正在使用 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 堆栈中)。 新选项卡应显示其根视图控制器,而没有任何先前从旧选项卡推送的视图。

ios uikit uinavigationcontroller uitabbarcontroller uitabbar
1个回答
0
投票

这应该可以做到:

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

© www.soinside.com 2019 - 2024. All rights reserved.