Switch tab bar programmatically in Swift

XcodeSwiftUitabbarcontroller

Xcode Problem Overview


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.

Xcode Solutions


Solution 1 - Xcode

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
}

Solution 2 - Xcode

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
}

Solution 3 - Xcode

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
}

Solution 4 - Xcode

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAzabellaView Question on Stackoverflow
Solution 1 - XcodeLeo DabusView Answer on Stackoverflow
Solution 2 - XcodeDarryl LopezView Answer on Stackoverflow
Solution 3 - XcodeAnthony AkentievView Answer on Stackoverflow
Solution 4 - Xcodednaatwork.comView Answer on Stackoverflow