1
votes

Hello guys,

I have a general design problem with iPhone application. I want to know the main principle how to go from normal view with navigationController to tabBarController with tabs where each tab has it's own navigationController (dont need first navigationController any more).

Let me show you how I made this:

First I added some view with a button to navigationController. AppDelegate adds this navigationController (with view controller of course) as subView to window:

[window addSubview:navigationController.view];

When I get to that new view (with navigationController on top) I click on button that takes me to new view which has tabBarController (with his own navControllers):

SearchViewController *searchViewController = [[SearchViewController alloc] initWithNibName:@"SearchView_iPhone" bundle:nil];
searchViewController.tabBarItem.title = @"FirstTab";
UINavigationController *searchNavigationController = [[UINavigationController alloc] initWithRootViewController:searchViewController];

SettingsViewController *settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsView_iPhone" bundle:nil];
settingsViewController.tabBarItem.title = @"SecondTab";
UINavigationController *settingsNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsViewController];

//Add navigation controllers to tabBar controller
tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = [NSArray arrayWithObjects:searchNavigationController, dictionariesNavigationController, settingsNavigationController, nil];

Ok, I added all views (with navControllers) to tabBarController. All I have to do is to push tabBarController to be seen:

[self.navigationController pushViewController:tabBarController animated:YES];

But after that I see that navigationController from first view is still present on views with tabBars. This is logical, because I pushed tabBarController with navigationController. So I did this to hide it:

self.navigationController.navigationBarHidden = YES;

Now it looks ok. All of the tabBar views has it's own navController.

THE MAIN PROBLEM: When I want to push another view (settingsResultsViewController) from subviewed table (settingsTableViewCell) which is in settingsViewController nothing happens. Here is the code:

SettingsResultsViewController *settingsResultsViewController = [[SettingsResultsViewController alloc] initWithNibName:@"SettingsResultsView_iPhone" bundle:nil];
[self.navigationController pushViewController:settingsResultsViewController animated:YES];

I also tried to push this view with appDelegate like this:

[delegatePhone.settingsViewController.navigationController pushViewController:settingsResultsViewController animated:YES];
[delegatePhone.firstViewController.navigationController pushViewController:settingsResultsViewController animated:YES];

But again nothing happens.

I assume that the main problem is in navigationControllers. The first navigationController is still somewhere in the back while I want to push with current navController on that particular tabBar.

Is there a way to push new view (tabBarController in my case) from first view other than with navigationController ?

All I want is when the button on firstView is clicke that app takes me to tabBarController and forget about firstView (and first navigationController) at all - I dont need them any more.

Hope I made it clear.

Thanks for all your help. I really appriciate it.

2
I have googled for solution and some one said that I need to set tabBarController as the root view controller. Is that right? How can I do that ? - Borut Tomazin

2 Answers

0
votes

You could display the tab bar controller by calling presentModalViewController:animated: instead of pushing it to a navigation stack. And if you don't need the first navigation controller at all, you should probably replace it with a standard view controller.

0
votes

The Tweetie author commented in a thread concerning tab bars and nave controllers a while back. Does this thread help?

Tab bar controller inside a navigation controller, or sharing a navigation root view