Matrosov Alexander Matrosov Alexander - 5 months ago 76
iOS Question

How to implement tab bar controller with navigation controller in right way

I am using Storyboard and Xcode 6. I have next controllers and scenes in my Storyboard:

UINavigationController
that has
HomeViewController
as a root.
HomeViewController
has a button that
Show (e.g. Push)
UITabBarController
.
UITabBarController
has 4
UIViewControllers
.

But my problem that after I Show
UITabBarController
there are no Navigation Bars in 4
UIViewControllers
. But I supposed that if I
Show (e.g. Push)
UITabBarController
then it should has embedded navigation controller that is initial controller in storyboard. Am I right? And if so how can I setup then navigation bar in Storyboard, because there are now default bar event in pushed tab bar that I see on storyboard. I have selected UIViewController and set simulated metrics in identity inspector to Translucent Navigation bar for the Top property, but I supposed it should be automatically added to this controller and to the tab bar without additional steps.

Or should I add new navigation controller for each tab bar items that will have their root view controllers?

The main question why I don't see navigation bar in storyboard using show (e.g. Push). For example if I add navigation controller and then set as root - tab bar controller then Xcode automatically add top navigation bar, but if the queue has an extra step like in my case HomeViewController the top navigation bar never appear automatically.

Answer

Hi you need to embed each view controller that is within the tab bar in a navigation controller of its own. So the flow is like so (HomeVC is embedded in a NavController of it's own):

                                         / --> `NavController` --> `ViewController1`
                                         | --> `NavController` --> `ViewController2`
`HomeViewController`-->`TabBarController`|--> `NavController` --> `ViewController3`
                                         \--> `NavController` --> `ViewController4`

To answer your questions: A UITabBarController in the View Controller hierarchy second only to primary View Controllers. A Navigation Bar cannot be inherited through a Tab Bar controller because it is also a secondary hierarchical Controller. This document will help outline more information about it. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITabBarController_Class/

To embed your controller you can do the following:

  1. Go to Editor --> Embed In --> Tab Bar Controller (or Navigation Controller)

How to embed correctly

The reason why you cannot use a Navigation Controller in front of a Tab bar controller is because a Navigation Controller uses navigating from root view through a series of views. A Tab Bar switches views to whatever is next inline. So a navigation view controller must be next inline in order for the View Controller to inherit a Navigation Bar. I hope this answers your question.