1
votes

I have a UITabBarController. One of the tabs contains a UINavigationController.

I'd like to push a view controller onto the navigation stack and hide the tab bar on that view controller. I can do this easily with:

toVC.tabBarController?.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(toVC, animated: true)

or doing it in the storyboard:

hidesBottomBarWhenPushed

The problem is, this hides the tab bar for any subsequent view controllers I push onto the stack. I'd like to simply hide the tab bar for this one view controller and show it for all other view controllers before and after it.

3

3 Answers

3
votes

There is a workaround. It works the way it is presented on gif below.

the gif

For each UIViewController that is pushed into the UINavigationController stack I override the hidesBottomBarWhenPushed property this way:

override var hidesBottomBarWhenPushed: Bool {
    get {
        switch navigationController?.topViewController {
        case .some(let controller):
            switch controller == self {
            case true:
                return super.hidesBottomBarWhenPushed
            case false:
                return false
            }
        default:
            return super.hidesBottomBarWhenPushed
        }
    }
    set {
        super.hidesBottomBarWhenPushed = newValue
    }
}

The first switch checks whether this controller belongs to some UINavigationController stack. The second switch checks whether current top UIViewController of UINavigationController stack is self.

Hope it will work in your case. Happy coding (^

0
votes

If you hide on the storyboard then by this property your tab bar will hide for all the view controllers. So you can manage this by code.

You can do this programmatically by just writing one line of code in ViewDidLoad() or ViewWillAppear() method

For Swift 3:-

self.tabBarController?.tabBar.isHidden = true

And where you want to unhide the tab bar just write the following code in ViewDidLoad () or ViewWillAppear() method

self.tabBarController?.tabBar.isHidden = false

0
votes

Try this in the view controller you want to hide the tab bar in:

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

And this in the view controllers before and after the one you want to hide the tab bar in:

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

EDIT:

Fully implemented example:

class ViewController1: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.isHidden = false
    }
}

class ViewController2: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.isHidden = true
    }
}

class ViewController3: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.isHidden = false
    }
}

enter image description here