navigation bar in Detail side of master-detail controller missing

lugonja picture lugonja · Nov 22, 2013 · Viewed 8.8k times · Source

I made masterdetailview with different viewcontrollers in my storyboard and linked every one with push segue. Now when I click on list item new DetailViewController opens, but every single one have no navigationbar. I added navigation item on top off every View, added title for every single one, but after all that navigation bar is not showing. I am working on iPad app and in both orientations navigation bar is missing.

EDIT:

My appDelegate is same as template when you create your Master-Detail project:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

    return YES;
}

One of my DetailViewControllers:

#import "MediaExpDetailViewController.h"

@interface MediaExpDetailViewController ()
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
@end

@implementation MediaExpDetailViewController

#pragma mark - Managing the detail item

- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;
    }
    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    }
}


- (void)viewDidLoad{

    [super viewDidLoad];
}

#pragma mark - Split view

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    barButtonItem.title = NSLocalizedString(@"MasterButton", @"Master");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
    self.masterPopoverController = popoverController;
}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    // Called when the view is shown again in the split view, invalidating the button and popover controller.
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
    self.masterPopoverController = nil;
}


@end

Answer

Marc picture Marc · Nov 22, 2013

Your DetailViewController has to be connected to a UINavigationController. If you set up a new master-detail-project from Xcode's "New Project" menu you will get this:

enter image description here

Notice: Every Detail view controller has to be connected to a UINavigationController (directly or indirectly).

Edit: To connect multiple UINavigationControllers, do the following: Your initial detail views UINavigationController is connected with the split view (as usual). Every others detail views UINavigationController is connected with the master view (with a replace segue):

enter image description here

If you want to give the user the possibility to switch back to the initial detail view, you also have to connect the initial view controller with the master (thus having two connections, one to the split, one to the master).

To switch between detail view controllers, you call performSegueWithIdentifier:sender: in your master view controller.

Edit 2:

To add your detail views as the split view's delegate implement the following method, which gets called earlier than viewDidLoad

- (void)awakeFromNib
{
    self.splitViewController.delegate = self;
}