On View1 I hide the navigationBar in viewDidLoad:
- (void)viewDidLoad
{
[super viewDidLoad];
[self.navigationController setNavigationBarHidden:YES];
}
Then I navigate to View2 where I show the navigationBar
- (void)viewDidLoad
{
[super viewDidLoad];
[self.navigationController setNavigationBarHidden:NO];
self.title = #"Title";
}
But on back to View1 again, the navigationBar doesn't hide, even if I did tried to hide it after the pushViewController in View2
[self.navigationController pushViewController:View1 animated:YES];
[self.navigationController setNavigationBarHidden:YES];
I also tried to hide the navigation from viewWillAppear in View1 and it hides it, but there is an ugly delay and I don't find it as a good practice.
So can anyone help me with this issue, how can I hide correctly the navigationBar on back to View1?
The best practice to do what you want is putting bellow in your first viewController:
- (void)viewWillAppear:(BOOL)animated{
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated{
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
-(void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
The ViewController1 is not going to get allocated again and so viewDidLoad is not going to get called.
You can do it in viewWillAppear though. But if you are saying that there is a delay, you can do one more thing.
You can get the reference ofViewController1 in ViewController2. Suppose ViewController1 is the first controller in the navigation controller, then do this:
//ViewController2.m
- (IBAction)backButtonPressed:(id)sender{
ViewController1 *view1 = [self.navigationController.viewControllers objectAtIndex:0];
[view1.navigationController setNavigationBarHidden:YES];
Your code is correct, but you need to write like this:
[self.navigationController setNavigationBarHidden:YES];
first, then write
[self.navigationController pushViewController:View1 animated:YES];
See when you are pushing View2 from View2 in navigation stack than View1 doesn't gets deallocated. it is there in in the stack. So when you popping out View2 that time View1 viewDidLoad won't get called. so your code setNavigationBarHidden to hide navigation bar doesn't executes. So put that code to ViewWillAppear or ViewDidAppear because these methods gets called every time View appears.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
Related
I have a problem about the navigation bar.
I have ViewControllerA with a hidden NavigationBar. I have set the navigationBar hidden using the code below:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
I push ViewControllerA and then ViewControllerA again. But NavigationBar will appear when I go back to First ViewControllerA by using system gesture.
I hope I can get some ways to solve this problem. Thanks.
You're almost there, hide it in ViewControllerA and then show it in ViewControllerB, don't show it when ViewControllerA will disappear. The below code is all you need, good luck.
ViewControllerA:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
ViewControllerB:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
Dear First You are set Navigation bar hidden at Navigation Controller Property (Storyboard->Click Navigation Controller->Property) and You want Navigation Bar in any View Controller Scene so your are add this code in .m file of view controller.
-(void)viewWillAppear:(BOOL)animated{
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
I have a HomeViewController and it has a property searchViewController.
HomeViewController is the delegate of searchViewControllerDelegate so that I can pop searchViewController when I click a button in searchViewController.view (I use pushViewControllerAnimated: to push searchViewController into view controller stack.
I want to show the navigationBar when the searchViewController is popped up.
However
[self.navigationController.navigationBar setHidden:NO];
is definitely not working.
I've checked that the navigationBar is not nil so I can't figure out what the problem might be.
actual code
#pragma mark - HomeTabSearchTableViewDelegate
-(void)parentViewControllerPop{
[self.navigationController popViewControllerAnimated:YES];
[self.navigationController.navigationBar setHidden:NO];
}
searchViewController is popped up successfully, just the navigationBar problem.
on your HomeViewController
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO]; //shows
//or use like
// [[self navigationController] setNavigationBarHidden:NO animated:YES];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:YES]; // hides
//or use like
// [[self navigationController] setNavigationBarHidden:YES animated:YES];
}
I have a master viewController and many detail viewController. Master viewController doesn't have any UINavigationBar but detail viewController has UINavigationBar. So I have some problem. When I swipe from detailVC to masterVC UINavigationBar hiding in detailVC
Have you any solution this?
I use these methods (master viewController )
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
(detail viewController)
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
Finally
I have solved this issue.
I wrote UINavigationBar hiding code for firstVC in the viewDidAppear method.
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
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.
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 :)
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.
SDK 6.1, Target 6.1, use storyboard
aView has a a UIButton. I use action segue [push] to the bView
When I click this button push bView is ok
But I pop aView have a back bars, how do I solve this problem?
aView.m
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController.navigationBar setHidden:YES];
}
bView.m
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController.navigationBar setHidden:NO];
}
I got what is your problem. You are hiding your navigation bar in the viewWillAppear: method of viewA and you are doing it without animation.
Try this
// This will add an animation like slide out. So you may won't like it.
[self.navigationController setNavigationBarHidden:YES animated:YES];
If it is not working, then add this code in bView.m
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:NO];
[super viewWillDisappear:animated]
}