Pushing a navigation controller is not supported
Like rmaddy said in the comments you are trying to push a navigation controller.
Navigation controllers should be presented (via presentViewController or they can be added as a childViewController) and ViewControllers should be pushed.
When you talk about pushing Navigation Controller, it is most likely that you want to present it.
- Presenting UINavigationController
This is the most common way and this is what you want to do in most cases. UINavigationController
cannot be pushed, it can only be presented with a new root View Controller.
MyViewController* vc = [[MyViewController alloc] initWithNibName:@"MyController" bundle:nil];UINavigationController *myNav = [[UINavigationController alloc] initWithRootViewController: vc];[self presentViewController:myNav animated:YES completion:nil];
What you do here, is firstly create a UINavigationController
and then set necessary UIViewController
as its root controller.
- Pushing UINavigationController
If you have a hierarchy of ViewControllers and you need to push view controller that contains navigation controller within, steps are:
1) Push ViewController, containing UINavigationController
.
To push UINavigationController
, first create a subclass of UIViewController
, which will be a wrapper-/container- class for your UINavigationController
and its content.
ContainerViewController* vc = [[ContainerViewController alloc] init];
2) Adding UINavigationController as a child view controller
In viewDidLoad
of your container (that you have just instantiated) simply add something like this:
Objective-C
UINavigationController* myNav = [[UINavigationController alloc] initWithRootViewController: rootViewController];[myNav willMoveToParentViewController:self];myNav.view.frame = self.view.frame; //Set a frame or constraints[self.view addSubview:myNav.view];[self addChildViewController: myNav];[myNav didMoveToParentViewController:self];
Swift 4.2+
let childNavigation = UINavigationController(rootViewController: viewController)childNavigation.willMove(toParent: self)addChild(childNavigation)childNavigation.view.frame = view.frameview.addSubview(childNavigation.view)childNavigation.didMove(toParent: self)
What you do here is basically instantiate your navigation controller and add it as a child controller to your wrapper. That's it. You have successfully pushed your UINavigationController.