Multiple segues remove navigation bar in view controller - ios

I have a view controller that has a navigation bar. It is the root view controller of the navigation controller. I have another view controller that can be segued from a button on the first controller. Up to this point, everything works fine; there are navigation bars on both view controllers.
However, from the second view controller, I want to be able to segue back to the first controller. When doing this, it removes the navigation bar from both of the view controllers.
How can I get the navigation bar on both view controllers with buttons as transitions? Thanks!

Implement below method in your both viewcontroller,
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
You may hiding navigationbar somewhere.

Try this in storyboard:
Select the navigation controller -> Attributes Inspector -> Under Navigation controller and Bar Visibility leave the "Show navigation bar" blank

Related

Why doesn't the tab bar show up on my view controllers?

I have the following in Interface Builder:
The top left is my main view controller where I have 2 buttons that have segue to two UIViewControllers. These two UIViewControllers are linked with the Tab Bar Controller. However, how could I make those 2 buttons to link to specifically to one/other views? Right now it's connected specifically, but it (or something else) causes the bar tab not show up.
Is it the problem that I don't have the Tab Bar Controller connected to the main view?
Yes, you're right that the problem occurs because the tab bar controller needs to be the destination of the segues. Fix it like this:
In IB, erase the segues from the two buttons and create two new ones, one from each button to the tab bar controller. Give each one an identifier, like buttonA from one button and buttonB from the other.
In the view controller, implement prepareForSegue for each segue understanding that the destination is a tab bar controller and that each segue requires a different tab selection...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:#"buttonA"]) {
UITabBarController *tabBarController = (UITabBarController *)segue.destinationViewController;
tabBarController.selectedIndex = 0;
}
if ([segue.identifier isEqualToString:#"buttonB"]) {
UITabBarController *tabBarController = (UITabBarController *)segue.destinationViewController;
tabBarController.selectedIndex = 1;
}
}
That's not quite how the tabBarController works.
I can see your initial view controller is the one on the top left, and it pushes either of the other two on the right on to the navigation stack if you push a button. But in your current setup, at no point does the tab controller itself get pushed on to the stack.
Instead, you would want to have your initial view controller push the tab bar controller on to the stack, through a button or otherwise, and the tab bar controller will display your other two view controllers as its setup to do.

Different UIBarButtonItems if Pushed or Modal

I am trying to use different Navigation Bar Button Items for a single View Controller.
The View Controller can be :
pushed inside a Navigation Controller
presented modally inside a navigation controller
If it's presented modally, I need a close left bar button to dismiss the modal.
Is there a way to know if the VC is presented modally in order to set a dismiss left bar button accordingly?
I solved this problem by implementing such a method on UIViewController category
and then using this method in viewDidLoad to determine, whether the current controller presented modally or by pushing into navigation controller:
- (BOOL)isModal {
if (self.viewController.navigationController && self.viewController.navigationController.viewControllers.firstObject == self.viewController) {
return YES;
}
return NO;
}

Sync Navigation Bar To View Controller During Segue

PREAMBLE
VIEW CONTROLLER A: Has no navigation bar.
VIEW CONTROLLER B: Has a navigation bar.
At present: when segueing from VIEW CONTROLLER A to VIEW CONTROLLER B:
The navigation bar just appears [ rather than transitioning in sync with the VIEW CONTROLLER B body ].
QUESTION
How do I force the navigation bar to segue in sync with the view controller body ?
1.In view will appear of ViewController A hide navigation bar and viewwilldisappear in ViewController B show navigation bar.and
2.hide navigation bar in ViewControllerA and show navigation bar in ViewController B viewwill appear
3.when you push view controller use animated in the parametes [self.navigationcontroller pushviewcontroller:viewb animated:YES];

Navigation Controller between view controller and table view controller

Any ideas on how to add a Navigation Controller in iOS7 between a Table View and View Controller?
As soon as I embed the Navigation Controller to the table view the app crashes.
Without the Navigation Controller it works fine. But then the Table View becomes a View Controller. This is the code I'm using:
[self.navigationController performSegueWithIdentifier:#"setup" sender:self];
Here is my storyboard: http://sv.tinypic.com/r/1ztdnb/8
Okay, giving the comments here is what I think you want:
A LoginViewController which is a subclass of a UITableViewController. Should not display navigationBar.
A ProfileViewController also a subclass of a UITableViewController. Should display a navigationBar.
When a user taps LogIn button, ProfileViewController should be "pushed".
So the whole trick is to make navigation bar hidden for one view controller and visible for another. Well this is very easy to achieve - just use setNavigationBarHidden:animated: in viewWillAppear: for each view controller
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES/NO animated:animated];
}

Is there a way to pop back to previous navigation controller?

I have a base nav controller which has a tab bar controller nested inside. inside that tab bar controller is another nav controller nested in it. If I'm in the child nav controller I can pop to root view in one of the views but it only takes me to the root view of the CHILD nav controller. Is there a way to pop back to the first nav controller?
If you are using storyboard then you can use Unwind segue approach which always works for me
Just Control + drag from "Pop to Main Screen" UIButton to Exit (green button at bottom of scene) select unwind method declared in first screen with title "Main" e.g.
-(IBAction)customUnwind:(UIStoryboardSegue *)sender
{
NSLog(#"Unwind successful");
}
Try this,
You can pop to root view from the child nav controller by
UITabBarController *tc = (UITabBarController *)self.navigationController.parentViewController;
[tc.navigationController popToRootViewControllerAnimated:YES];

Resources