1
votes

I'm trying to present a TabBarController on top of another TabBarController. My application's MainWindow.xib looks like this:

Files Owner
First Responder
My App App Delegate
Window
TabBarContoller
    +TabBar
    +Nav Controller Subclass (a custom class)
        +Navigation Bar
        +Table View Contoller Subclass (custom class)
        +Tab Bar Item
    +Second View Controller (not yet hooked up)

I'm trying to display a xib file when an item is clicked in the TableView. This xib file has a TabBarController as it's main view, but when the view displays, the tab bar and navigation bar are both invisible. The code I'm using to display it is:

MyAppAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate.customNavController presentModalViewController:customDetailEditViewController animated:YES];

If I use the code below to push the view controller onto the stack, I see the correct navigation bar, but the TabBar from the root view controller is shown instead of the one from the view which has been pushed.

[delegate.customNavController pushViewController:customDetailEditViewController animated:YES];

I even tried removing the TabBarController and manually implementing my own TabBar delegates but the same effect occurs (either no NavigationBar or TabBar, or the NavigationBar/TabBar from the root ViewController).

EDIT: I've uploaded the source to http://mi6.nu/tabcontroller.zip . I'd really appreciate it if someone with a bt more experience with iOS could take a look.

EDIT2: The closest I've come so far is presenting a modal view controller inside the first tabbar, so my view looks like this:

NavigationBar  
[          ]
[          ] 
[---View---]
[          ] 
[          ] 
TabBar from the pushed view 
TabBar from the root view

To achieve this, I'm using:

UITabBarController *tabBarController = [[UITabBarController alloc] init];

    UIViewController *directionsView = [[UIViewController alloc] init];
    txtDirections = [[UITextView alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width, self.view.frame.size.height)]; 
    [directionsView.view addSubview:txtDirections];

    IconPickerViewController *iconPicker = [[IconPickerViewController alloc]init];
    tabBarController.viewControllers = [NSArray arrayWithObjects:recipeDetailEditViewController,directionsView,iconPicker, nil];
    [directionsView release];
    [iconPicker release];

    MyAppAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.rootNavController presentModalViewController:recipeDetailEditViewController animated:YES];

This just complicates everything though, since a) It's not ideal as I have two tabbars and b) all controls (all of the editing controls) need to be in the TableViewController so their values can be loaded/saved to edit items. It would be much easier if the pushed view could handle loading/saving and appear on top of the root tabs.

Surely this must be possible?

2

2 Answers

2
votes

This was an absolute nightmare, but I eventually got it working by presenting the view modally from the TableViewController when the add button is clicked:

[delegate.rootController presentModalViewController:recipeDetailEditViewController animated:YES];

delegate.rootController is the root TabBarController The XIB file I'm presenting does not have a TabBarController, but rather a UIView, a Navigation bar and a TabBar. This appears to work when presented modally from inside a NavigationController. Window Layout

0
votes

Why are you putting everything in your main.xib? Try moving the second tab bar out of the main window xib and instead put it inside the customDetailEditViewController.