Reputation: 25969
I have the following setup:
A tab bar app. On one tab there is a navigation controller.
My workflow:
When I push a new viewController onto the navigation controller stack, I set the hidesBottomBarWhenPushed property.
This works great, the tab bar is "pushed" as the new view controller slides in place.
The problem:
When I pop this view controller and the root view controller is once again displayed, however, the tab bar is gone.
The navigation controller has grown to fill the space left by tab bar.
Is there a property I need to set to make the tab bar visible again?
What I have tried:
popping to the root view manually
setting (resetting) the hidesBottomBarWhenPushed for the root view
resizing the root view
resizing the view property of the navigation controller (just leaves a "white space" where the tab bat should be)
What "sorta" worked:
If I set the selected index of the tab bar controller to any other index, the tab bar appears. So I know it is still "around", but this does little to help me.
Upvotes: 20
Views: 28564
Reputation: 698
I had the same issue and I couldn't fix it with any of the suggested approaches mentioned here.
I came up with a hacky way around this problem and it works fine, although in my case MAYBE because I am working with RxSwift, the issue appears to be a race-condition so I slightly delay the pop action and reveal the tabBar manually, nevertheless it might fix your problem as well:
if self.tabBarController?.tabBar.isHidden == true {
self.tabBarController?.tabBar.isHidden = false
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
self.navigationController?.popViewController(animated: true)
}
} else {
self.navigationController?.popViewController(animated: true)
}
Upvotes: 0
Reputation:
Swift 3: From code, you have to set pushedController.hidesBottomBarWhenPushed to true.
Storyboard: Select the pushed controller, go to Attribute Inspector, select "Hide Bottom Bar on Push" option under View Controller.
Upvotes: 0
Reputation: 16159
swift:
self.hidesBottomBarWhenPushed = true
self.performSegueWithIdentifier("viewcontroller_details", sender: nil)
self.hidesBottomBarWhenPushed = false
Upvotes: 1
Reputation: 6626
If you're using a UINavigationController
and looking for a way to just hide the TabBar (BottomBar) in one view controller, place this code in the view controller you'd like to the hide the TabBar for:
- (BOOL)hidesBottomBarWhenPushed {
return [self.navigationController.visibleViewController isEqual:self];
}
Other approaches I tried with just setting the property caused the TabBar to be hidden after pushing a new view controller from the view controller with the hidden TabBar (even after setting the property to NO).
Upvotes: 6
Reputation: 22691
Curious, I never set this value, but override it on the ViewController I want:
- (BOOL) hidesBottomBarWhenPushed
{
return YES;
}
Upvotes: 1
Reputation: 30727
In the view controller that appears after the one with the toolbar is popped, try this magic:
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setToolbarHidden:YES animated:YES];
}
Upvotes: 0
Reputation: 19
In addition to doing this:
[self.navigationController popToRootViewControllerAnimated:YES];
Initially when you do self.hidesBottomBarWhenPushed = YES;
You have to change for viewControllerToBePushed.hidesBottomBarWhenPushed = YES;
That should do the work!
Upvotes: 1
Reputation: 8835
I had this problem too. I was setting -hidesBottomBarWhenPushed on the wrong view controller.
Wrong (but seems to work until you pop):
self.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:self.anotherViewController animated:animated];
Right:
self.anotherViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:self.anotherViewController animated:animated];
Upvotes: 119
Reputation: 1
this is the same problem i had, but i got a solution, try this I found that hiding and then showing the tabbar immediately after the push, solves our problem
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *theItem = [items objectAtIndex:indexPath.row];
DetailController *nextController = [[DetailController alloc] initWithItem:theItem];
self.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:nextController animated:YES];
//
//[nextController setHidesBottomBarWhenPushed:YES];
self.hidesBottomBarWhenPushed=NO;
[nextController release];
}
Upvotes: 9
Reputation: 9796
I do something similar in my app - just calling:
[self.navigationController popToRootViewControllerAnimated:YES];
seems to do the trick and the tab bar is back - admittedly this is in response to a button press rather than the nav bar pop button. I seem to remember it worked fine when using the nav bar back button as well.
Perhaps check you are only setting a single view controller to have the hidesBottomBarWhenPushed property set to YES.
Upvotes: 1