【问题标题】:Getting back to main ViewController of the Tab Bar after moving between tabs在选项卡之间移动后返回选项卡栏的主 ViewController
【发布时间】:2016-12-02 14:35:07
【问题描述】:

我正在使用 Swift 2.3、XCode 8.0 开发 iOS 应用程序。我的应用程序有 4 个选项卡,每个选项卡都连接了 4 个不同的视图控制器。在 4 个视图控制器中,我嵌入了导航控制器。

我的要求是当用户选择选项卡 1 -> 转到 ViewController 1 -> 接下来用户可以转到第二个视图控制器,因为有一个导航控制器。 但是当用户选择第二个选项卡然后返回到第一个选项卡时,不会显示直接附加到选项卡 1 的第一个视图控制器,而是显示最后一次使用后退按钮打开的视图控制器。 如何直接移动到附加到第一个选项卡的视图控制器?

【问题讨论】:

    标签: ios uiviewcontroller swift2.3


    【解决方案1】:

    无论用户使用标签栏控制器处于哪个标签中,嵌​​入式导航控制器都应自动为您跟踪堆栈。确保每个选项卡都嵌入了自己的导航控制器,而不是将整个选项卡栏控制器嵌入到一个导航控制器中。

    例如,如果您以编程方式实现:

        let viewController1 = UIViewController()
        let navigationController1 = UINavigationController()
    
        navigationController1.setViewControllers([viewController1], animated: true)
    
        let viewController2 = UIViewController()
    
        let tabBarController1 = UITabBarController()
        tabBarController1.setViewControllers([navigationController1, viewController2], animated: true)
    

    无论用户在标签栏控制器中的哪个位置,navigationController1 都会跟踪堆栈顶部的视图控制器。

    【讨论】:

    • 我已经在 StoryBoard 中实现了 ViewControllers、NavigationsController 和 TabController 之间的连接,而不是以编程方式。那么如何在更改选项卡时从子视图控制器进入父视图控制器。请指教。
    【解决方案2】:

    谢谢,我找到了解决办法 -

    这对我有用 - 在我的主标签栏 viewController 中,我将其设置为 UITabBarController, UITabBarControllerDelegate 的代表,然后实现了 UITabBarControllerDelegatedidSelectViewController 方法,如下所示 -

    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        let index : Int = (tabBarController.viewControllers?.indexOf(viewController))!
    
        let navigationController = viewController as? UINavigationController
            navigationController?.popToRootViewControllerAnimated(false)
    
    }
    

    【讨论】: