Question

Tab Bar Application With Navigation Controller

I have a simple iPhone app that has a tab bar and 3 tabs. Each tab loads as a separate nib with a corresponding controller. Each nib contains a tableview with some other controls for searching/filtering etc.

What I would like (and cant seem to find an example of) is adding a navigation controller to the app so each nib (i.e. each tab) can drill down to further detail pages.

Should I be adding a navigation controller to the main window and creating an IBOutlet for it or should the NC be added to the nibs.

 45  69633  45
1 Jan 1970

Solution

 63

Once you have a tab bar in a XIB, the easiest way to approach this is to drag a UINavigationController object over from the Library window (looks like a left nav bar button on a gold background) into the Tree View for your tab bar (the text only view, not the GUI). Place the navigation controller inside the tab bar controller, then drag your existing view controller inside the navigation controller.

When you go to view that tab you should then see a navigation bar on the top of it... if you are loading the navigation controller from another xib, you'll modify the nav bar in the tab bar xib.

2008-12-15

Solution

 27

This is how to add the NavigationController programmatically (e.g. in you AppDelegate)

  UIViewController  *viewController1, *viewController2;

    viewController1 = [[[UIViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
    UINavigationController *navigationcontroller = [[[UINavigationController alloc] initWithRootViewController:viewController1] autorelease];

    viewController2 = [[[UIViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];

    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:navigationcontroller, viewController2, nil];

If you have a tableview in the Viewcontroller1 you can access the Navigationcontroller by using self.navigationController e.g. in the didSelectRowAtIndexPath to open a DetailView

eg.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

In this example the detailViewController inits with a NIB file, which adds a navigation bar with a back button. But if you init the detailViewController programmatically aswell, you can add an action (GoBack) to a UIBarButtonItem to remove the detailViewController from its navigationcontroller.

-(void) GoBack
{    
    [self.navigationController popViewControllerAnimated:YES];
}
2012-02-15