Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Push / Pop View Controller With Navigation Bar from View Controller Without Navigation Bar

I'm trying to push a view controller with a visible navigation bar from a view controller with a hidden navigation bar.

I tried all sorts of combinations of [[self navigationController] setNavigationBarHidden:YES animated:NO]; in viewWillAppear, viewDidAppear, viewWillDisappear... etc.

// First View Controller

@implementation FirstViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[self navigationController] setNavigationBarHidden:YES animated:NO];

    NSLog(@"[%@ viewWillAppear]", self);
}

@end


// Second View Controller


@implementation SecondViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[self navigationController] setNavigationBarHidden:NO animated:NO];

    NSLog(@"[%@ viewWillAppear]", self);
}

@end

Nothing worked. I also tried custom code to "animate" a push and pop, which works, BUT I lose the edge swipe and view panning. Before I dig deeper, just want to make sure I'm not reinventing the wheel.

The Starbucks app is what I'm trying to mimic.

The root view controller of the app (the dark background view) is full screen and notice how it doesn't have a UINavigationBar. But when you tap on one of the buttons, it pushes on a view controller (the light background view) WITH a UINavigationBar. From there, if you tap the "back" arrow, it view controller pops with the navigation bar. Interactive pop swipe gesture also works.

Starbucks iOS App

like image 318
YarGnawh Avatar asked Oct 14 '14 19:10

YarGnawh


2 Answers

It is possible without hacking together a solution by yourself. Here is what you do:

Your root viewController:

@implementation ViewController

....

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

@end

And the pushed viewController:

@implementation SecondViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

@end

This will do. It also keeps the interactive transition working ;)

I find it disturbing, however, that this type of functionality is not documented at all by apple. - You can also hide and show toolbars with these 'call-points' (inside viewWillAppear:)

EDIT

I just realized that this is the same code you wrote in your question. Please test it again. I am 100% sure that this works - I used this functionality in one of my apps, too.

Please also note that my code does use animated:animated instead of your animated:NO. This may be the crucial point here :)

like image 62
CodingMeSwiftly Avatar answered Oct 01 '22 01:10

CodingMeSwiftly


I just set up two view controllers to test this back and forth.

@interface VC1 ()

@end

@implementation VC1

- (void)viewDidLoad {
[super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationController.navigationBarHidden = YES;
}

@end

and a second

#import "ViewControllerTwo.h"

@interface ViewControllerTwo ()

@end

@implementation ViewControllerTwo

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden = NO;
}

@end

VC1 is embedded in a navigationController (which is the root controller for the app), with a button that navigates to ViewControllerTwo. I have a push segue from VC1 -> ViewControllerTwo, this method works. When I tap on the button, the view controller is visible on ViewControllerTwo, when I press back, the navigationBar is gone.

like image 41
domitall Avatar answered Oct 01 '22 03:10

domitall