返回到根视图控制器,但要返回到选项卡控制器中的特定选项卡。

4

我有5个选项卡,当弹出到根控制器时,它会带我到上次使用的选项卡。有没有办法跳转到特定的选项卡?

 //takes me to last used tab on the tab controller
 @IBAction func goHome(sender: AnyObject)
{
 self.navigationController?.popToRootViewControllerAnimated(true)
}

例如,如果我打开了10个视图控制器,然后点击上面的按钮,我想跳转到标签控制器索引0,也就是主页。

如果你正在使用 TabController,像 self.tabBarController.selectedIndex = 1 这样来选择第一个选项卡,那么你可以获取该特定选项卡的导航控制器并弹出到根视图控制器。 - Lucho
类似的问题.. http://stackoverflow.com/questions/8963450/jump-to-a-specific-tab-in-a-uitabbarcontroller - Droid GEEK
5个回答

5
func goToRootOfTab(index: Int) {
    let window = (UIApplication.shared.delegate as? AppDelegate)?.window
    let tabBar :UITabBarController? =  window?.rootViewController as? UITabBarController
    tabBar?.selectedIndex = index
    // pop to root if navigated before
    if let nav = tabBar?.viewControllers?[index] as? UINavigationController {
        nav.popToRootViewController(animated: true)
    }
}

2

这段代码将带您到标签页并弹出该标签页的根视图控制器

func buttonAction(sender: AnyObject){
    let someTabIndex = 0
    // Get the tabBar
    let t = self.tabBarController
    // Change the selected tab item to what you want
    t?.selectedIndex = someTabIndex
    // Pop the navigation controller of that index
    let v = t?.viewControllers?[someTabIndex]
    if let n = v?.navigationController {
        n.popToRootViewControllerAnimated(true)
    }

}

如果你想要执行 popToRootViewController(animated: false),你必须先隐藏这个导航控制器。因此,在弹出之前应该先调用t?.selectedIndex = i,就像苹果文档中关于popToRootViewController(animated:)所描述的那样。 - DawnSong

1

由于这是Swift,如果您的应用程序结构发生更改,您可能希望检查您是否有一个选项卡控制器作为祖先:

@IBAction func goHome(sender: UIButton) {
    self.navigationController?.popToRootViewControllerAnimated(true)
    if let tab = self.tabBarController {
        tab.selectedIndex = 0  // Or whichever number you like
    }
}

这仍然会带我到先前使用的选项卡。我要弹出的视图控制器没有显示选项卡控制器,这就是为什么我尝试弹出到根并选择选项卡,但仍然不起作用 =( - swiftTonio
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Phillip Mills
我正在使用导航控制器,它弹出到一个选项卡控制器的根视图,但是在弹出到根视图后无法选择索引。我不确定我的代码与其他人有什么不同。 - swiftTonio
但是听起来好像导航控制器不在选项卡内。导航控制器或导航控制器的根控制器如何显示? - Phillip Mills

0

第一种情况:当您想选择其他选项卡索引时

guard let VCS = self.navigationController?.viewControllers else {return }
for controller in VCS {
    if controller.isKind(of: TabBarController.self) {
        let tabVC = controller as! TabBarController
        tabVC.selectedIndex = index . (Select any index for tab)
        self.navigationController?.popToRootViewController(animated: true)
    }
}

第二种情况:当您想要访问RootViewController变量时

guard let VCS = self.navigationController?.viewControllers else {return }
for controller in VCS {
    if controller.isKind(of: TabBarController.self) {
        let tabVC = controller as! TabBarController
        //    tabVC.selectedIndex = 0 . //no need of this line if you want to access same tab where you have started your navigation
        let VCs = tabVC.selectedViewController as! MyViewController
        VCs.variableName = true . //access your variable
        self.navigationController?.popToRootViewController(animated: true)
    }
}

0

首先获取所选选项卡的引用,然后弹出到根。

if let tab = tabBarController  {
     tab.selectedIndex = 0
     if let navcon = tab.selectedViewController as? UINavigationController {
                        navcon.popToRootViewController(animated: true)
     }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接