在Swift中编程实现切换选项卡栏

58
我有一个选项卡应用程序,并且在我的第一个视图上有一个按钮,我希望在按下时通过编程方式切换到我的第二个选项卡。
我似乎无法弄清楚如何获取索引等来切换它,我已尝试过类似以下的东西。
tababarController.selectedIndex = 1

没有成功。

4个回答

118

这很简单,tabBarController 声明为可选类型。

var tabBarController: UITabBarController? { get }

视图控制器层次结构中最接近的祖先是选项卡栏控制器。如果视图控制器或其任何祖先是选项卡栏控制器的子级,则此属性包含所属的选项卡栏控制器。如果视图控制器未嵌入选项卡栏控制器中,则此属性为nil。

因此,您只需要在其末尾添加“?”即可:

@IBAction func goToSecond(_ sender: Any) {
    tabBarController?.selectedIndex = 1
}

有没有办法让选项卡滑动而不是突然更改? - user3916570
@vinbhai4u 很抱歉这么久才回复。我现在才看到您的评论 :( 如果您正在为UITabBarController建立子类,您只需要设置selectedIndex selectedIndex = 1即可。 - Leo Dabus

15

Swift 3:

func switchToDataTab() {
    Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(switchToDataTabCont), userInfo: nil, repeats: false)
}

func switchToDataTabCont(){
    tabBarController!.selectedIndex = 0
}

Swift 4+:

func switchToDataTab() {
    Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(switchToDataTabCont), userInfo: nil, repeats: false)
}

@objc func switchToDataTabCont(){
    tabBarController!.selectedIndex = 0
}

这是一个简单的想法,但当有时点击相同的TabViewController屏幕时,它确实非常有效。非常感谢大家。 - Hari Narayanan

7
Leo Dabus提供的解决方案(见上文)对我来说很有效。然而,有些控件状态不佳。无法修复,但这个小技巧会对你们所有人都有好处:
func switchToDataTab(){
    NSTimer.scheduledTimerWithTimeInterval(0.2,
        target: self,
        selector: "switchToDataTabCont",
        userInfo: nil,
        repeats: false)
}

func switchToDataTabCont(){
    tabBarController!.selectedIndex = 0
}

我其实遇到了非常类似的问题。即使调用了 tableView.reloadData()UITableView 的状态仍然没有改变。感谢提供解决方法!你可能知道背后的原因或者有更好的解决方案吗? - Marcin Świerczyński
Swift 5.0 需要定时器。 - TM Lynch

2

添加到安东尼的代码中:

func switchToDataTab(){
    NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: #selector(switchToDataTabCont), userInfo: nil,repeats: false)
}

func switchToDataTabCont(){
    tabBarController!.selectedIndex = 0
}

选择器类已更改为

#selector(switchToDataTabCont)

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