58

I have a tab bar application and i have a button on my first view which i want to when pressed switch to my second tab programmatically in the tab bar.

I can't quite seem to figure it out how to get the index etc to switch to it i've tried stuff like this.

tababarController.selectedIndex = 1

With no success.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Azabella
  • 837
  • 2
  • 10
  • 18

4 Answers4

118

Thats pretty simple tabBarController is declared as an optional type

var tabBarController: UITabBarController? { get }

The nearest ancestor in the view controller hierarchy that is a tab bar controller. If the view controller or one of its ancestors is a child of a tab bar controller, this property contains the owning tab bar controller. This property is nil if the view controller is not embedded inside a tab bar controller.

So you just need to add "?" at the end of it:

@IBAction func goToSecond(_ sender: Any) {
    tabBarController?.selectedIndex = 1
}
Leo Dabus
  • 229,809
  • 59
  • 489
  • 571
  • Is there a way to make it so that the tab slides instead of just changing abruptly? – user3916570 Oct 14 '15 at 15:29
  • @vinbhai4u sorry about the long feedback response. I just saw your comment now :(. if you are subclassing UITabBarController you just need to set the selectedIndex `selectedIndex = 1` – Leo Dabus Nov 12 '17 at 15:53
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
}
pkamb
  • 33,281
  • 23
  • 160
  • 191
Darryl Lopez
  • 151
  • 1
  • 3
  • This is the simple idea but its really works great, when sometimes click the same TabViewController screen.. Thank you so much guys.. – Hari Narayanan Sep 18 '21 at 19:25
7

The solution provided by Leo Dabus (see above) works fine for me. However - some controls have bad states. Can't fix that, but this little workaround will do you all good:

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

func switchToDataTabCont(){
    tabBarController!.selectedIndex = 0
}
Anthony Akentiev
  • 1,001
  • 11
  • 9
2

Add to Anthony's code:

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

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

Where the selector class has been changed to

#selector(switchToDataTabCont)
dnaatwork.com
  • 362
  • 5
  • 9