Yannis
Yannis

Reputation: 6157

How to hide parent tabbar when pushing controller in navigationController

I have an application with a tab bar controller and each view contains a navigation controller. My MainWindow looks as follows: Image here http://www.freeimagehosting.net/image.php?7bc867a594.png

Everything works fine as it is but I noticed a problem when pushing a details view to the navigation controller. In the didSelectRowAtIndexPath for a tableviewcontroller that belongs to the tab bar controller (the one called Latest in the image) I am doing this:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ArticleViewController *articleController = [[ArticleViewController alloc] initWithNibName:@"ArticleView" bundle:nil];

    [self.navigationController pushViewController:articleController animated:YES];

    [articleController release];
    articleController = nil;
}

The ArticleViewController has its own tabbar because it needs to display different things. The problem is that when I push the ArticleViewController into the navigationController I see both tabbars at the bottom of the view. Is there any way I can solve this problem?

Thanks in advance

Upvotes: 32

Views: 25270

Answers (8)

user8043247
user8043247

Reputation:

for swift 3,write the same code by you unhide the tabbar before pushviewController code like below

var frame = self.tabBarController?.tabBar.frame
frame?.origin.y = self.view.frame.size.height - (frame?.size.height)!+112
UIView.animate(withDuration: 0.2, animations: {
  self.tabBarController?.tabBar.frame = frame!
})
self.navigationController?.pushViewController(viewController, animated: true)

or use just whant to unhide the tabbar u can use

viewController.hidesBottomBarWhenPushed = false

Upvotes: 2

Haroldo Gondim
Haroldo Gondim

Reputation: 7995

Use property hidesBottomBarWhenPushed in the controller that you want to hide.

For hide, all controllers put into prepare for segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.hidesBottomBarWhenPushed = true
}

Upvotes: 1

Teena nath Paul
Teena nath Paul

Reputation: 2239

You can add below code in the view controller, which you are pushing.

-(BOOL)hidesBottomBarWhenPushed
{ 
     return YES;
}

This will hide the tabbar in the pushed view controller only and as you pop the view controller tabbar remains unhide in rest all view controllers.

Swift version (3.x and above)

override var hidesBottomBarWhenPushed: Bool {
    get {
        return navigationController?.topViewController == self
    }
    set {
        super.hidesBottomBarWhenPushed = newValue
    }
}

Thanks

Upvotes: 6

Deep
Deep

Reputation: 436

You can simple hide parent tabbar through storyboard .

Select viewcontroller > Attribute Inspector > check Hide Bottom Bar on Push

Upvotes: 7

Nits007ak
Nits007ak

Reputation: 753

enter image description here

Go to interface builder in Xcode -> open attribute inspector and check the item 'Hide Bottom bar on Push' for view controller you don't want to show tab bar. It will work!!

Upvotes: 1

Viktor Kucera
Viktor Kucera

Reputation: 6335

If you prefer storyboard configuration over coding there is a toggle for that. Just go destinationViewController > Attribute Inspector:

enter image description here

Upvotes: 38

Mrinal Mandal
Mrinal Mandal

Reputation: 235

A very simple solution:

 destinationViewController.hidesBottomBarWhenPushed = YES;

In your case:

 articleController.hidesBottomBarWhenPushed = YES;

Hope this helps!

Upvotes: 17

Yannis
Yannis

Reputation: 6157

After spending hours and posting a question here I found that the solution to this problem is adding the following line after the instantiation of ArticleController.

articleController.hidesBottomBarWhenPushed = YES;

Upvotes: 103

Related Questions