Rodrigo Ruiz
Rodrigo Ruiz

Reputation: 4355

Setting isUserInteractionEnabled on tabBar doesn't work the first time

If I have a UITabBarController and do this inside one of its view controllers:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    tabBarController?.tabBar.isUserInteractionEnabled = false
}

the first time it shows, I can still change tabs.

If I tap on another tab and tap back on the first tab, then the tabbar is really disabled, but not the first time.

Why? And how do I solve this?

EDIT:

There is one detail I noticed, the tabBarController?.tabBar.isUserInteractionEnabled = false has to be on the second view controller of a navigation controller. In other words:

Say I have that structure

UITabBarController
    UINavigationController
        UIViewController (1)
        UIViewController (2)
    UIViewController (3)

So if I add that viewDidAppear code on view controller (2), you can change the tab once, but not the second time (after you navigate to it, obviously).

And there is more, if I go back after navigating to view controller (2), the tab bar becomes "interactable" again, without my setting it to true.

Upvotes: 1

Views: 919

Answers (2)

CodeNoob
CodeNoob

Reputation: 250

While I have experienced the same behavior with:

tabBarController?.tabBar.isUserInteractionEnabled = false

..what you CAN do is disable each of the items in the tabBar.items collection, and then re-enable them in the viewWillAppear method of another controller. For example, if you didn't want your users tabbing out of menu #1 once they are inside it, you could do something like this in the subsequent controller(s):

override func viewWillAppear(_ animated: Bool) {
    //0th tab items remains enabled as "only choice" for user
    self.tabBarController!.tabBar.items![1].isEnabled = false
    self.tabBarController!.tabBar.items![2].isEnabled = false
    self.tabBarController!.tabBar.items![3].isEnabled = false
    self.tabBarController!.tabBar.items![4].isEnabled = false 

}

when the user tabs back to first tab (0) (or hits the back button), in that viewController's viewWillAppear method, re-enable the items:

    override func viewWillAppear(_ animated: Bool) {
    //re-enable tab items
    self.tabBarController!.tabBar.items![1].isEnabled = true
    self.tabBarController!.tabBar.items![2].isEnabled = true
    self.tabBarController!.tabBar.items![3].isEnabled = true
    self.tabBarController!.tabBar.items![4].isEnabled = true 

}

Upvotes: 1

Shades
Shades

Reputation: 5616

Having a tab bar in view, but not being able to interact with it will probably be confusing and frustrating for the user. And while I don't have the reason or solution for the original question, I have an alternative suggestion:

Hide the tab bar in UIViewController (2):

override func viewDidLoad() {
    super.viewDidLoad()
    tabBarController?.tabBar.isHidden = true
}

We're putting this in viewDidLoad so it's hidden as soon as the view appears.


This also requires that you explicitly unhide it in UIViewController (1) for when the user hits the back button. Do it in viewWillAppear since the view was loaded already and we're going back to it.

override func viewWillAppear(_ animated: Bool) {
    tabBarController?.tabBar.isHidden = false
}

Upvotes: 1

Related Questions