Tabbarcontroller with navigation controller - iphone

I am adding view controller in navigation controller and then adding it to tab bar controller. but if i add this like
navigationController.viewControllers =
[NSArray arrayWithObjects:rootViewController, rootViewController.photoViewController, nil];
tabBarController.viewControllers = [NSArray arrayWithObjects:tourNavigation,mapNavigation ,browserNavigation,
navigationController,nil];
This is not showing tab with fourth navigation controller.. other controllers are simple as
BrowserViewController *browserView = [[BrowserViewController alloc]initWithNibName:#"BrowserViewController"
bundle:nil];
browserView.title = #"Browser";
UINavigationController *browserNavigation = [[[UINavigationController alloc]initWithRootViewController:browserView]
autorelease];
This is working fine.. but navigation with array is not displaying.

I don't think you should be setting the navigation controller's viewControllers array like that. Instead try:
navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[navigationController pushViewController:rootViewController.photoViewController animated:NO];
This is assuming that you want the photo view controller to be showing when the user taps on the tab. It will be on top of the navigation controller's stack.

You need to start with view based application. And then create a UITabbarController in you appDelegate file.
Appdelegate.h
UITabBarController *tabBarController;
// set properties
Appdelegate.m
// Synthsize
tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate=self;
//Adding Search,Nearby,Map,AboutUs,Favorites Tabs to tabBarController
Search * search = [[Search alloc] init];
UINavigationController *searchNav = [[UINavigationController alloc] initWithRootViewController:search];
Nearby* nearby = [[Nearby alloc] init];
UINavigationController *nearbyNav = [[UINavigationController alloc] initWithRootViewController:nearby];
Map* map = [[Map alloc] init];
UINavigationController *mapNav = [[UINavigationController alloc] initWithRootViewController:map];
AboutUs* aboutUs = [[AboutUs alloc] init];
UINavigationController *aboutUsNav = [[UINavigationController alloc] initWithRootViewController:aboutUs];
Favorites* favorites = [[Favorites alloc] init];
UINavigationController *favoritesNav = [[UINavigationController alloc] initWithRootViewController:favorites];
NSArray* controllers = [NSArray arrayWithObjects:searchNav,nearbyNav,mapNav,aboutUsNav,favoritesNav, nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
You can accordingly manage in which tab you want to place navigation controller or only a view controller.
Then in each of the view controllers mentioned above you need to implement
- (id)init {}
in which you can set Tab name and image.

Related

Programmatically creating tab bar for ViewController

I've been looking at programatically adding a tab bar to my view controller because having a scroll view I can't place it on without it being in the middle of my view. I'm abit confused about how to add it. Does it need to be initiated in my ViewDidLoad method or my AppDelegate?
If I have:
UITabBarController *tabBar = [[UITabBarController alloc] init];
[self.view addSubview:tabBar.view];
[tabBar release];
How can I allocate it to the bottom of my scrollview?
Thanks!
Now in my appDelegate class :
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[ViewController alloc] initWithNibName:#"ViewController" bundle:nil];
UITabBarController *tabBarController = [[UITabBarController alloc] init];
ViewController* vc = [[ViewController alloc] init];
NSArray* controllers = [NSArray arrayWithObjects:vc, tabBarController, nil];
tabBarController.viewControllers = controllers;
[_window addSubview:tabBarController.view];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
It's crashing and not sure if it's a release I'm missing.
Edit:
For anyone else wondering this in Appdelegate.m:
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.viewControllers = #[viewController1, viewController2, viewController3, viewController4];
Take a look at this Documentation given by Apple: ViewControllers.
Sample Code :
- (void)applicationDidFinishLaunching:(UIApplication *)application {
UITabBarController *tabBarController = [[UITabBarController alloc] init];
FirstViewController* vc1 = [[FirstViewController alloc] init];
SecondViewController* vc2 = [[SecondViewController alloc] init];
NSArray* controllers = [NSArray arrayWithObjects:vc1, vc2, nil];
tabBarController.viewControllers = controllers;
// Add the tab bar controller's current view as a subview of the window
[window addSubview:tabBarController.view];
}
I did it this way. I copied this from my App Delegate and it works fine. Basically you add the view controllers to the tab bar then add the tab bar to the window's subview.
Instantiate the instance
iVacationTabBar = [[UITabBarController alloc] init];
However you create the views/view controllers:
UINavigationController *rvc_tools = [[UINavigationController alloc] initWithRootViewController: vc_tools];
UINavigationController *rvc_settings = [[UINavigationController alloc] initWithRootViewController: vc_settings];
UINavigationController *rvc_about = [[UINavigationController alloc] initWithRootViewController: vc_about];
UINavigationController *rvc_currentpage = [[UINavigationController alloc] initWithRootViewController: vc_currentpage];
UINavigationController *rvc_backup = [[UINavigationController alloc] initWithRootViewController:vc_backup];
Add the controllers to the array:
NSArray* controllers = [NSArray arrayWithObjects: rvc_currentpage, rvc_tools,rvc_settings, rvc_backup, rvc_about, nil];
Set the array of view controllers to your tab bar:
[iVacationTabBar setViewControllers: controllers animated:NO];
Add the tab bar to the window's subview.
[_window addSubview:iVacationTabBar.view];
You can not add a UITabbarController on a UIViewController. Instead, on a ViewController you have to show the TabbarController, create a TabbarController, set ViewControllers for it, and add it to a Window.

Titles are not showing in the navigation bar iphone app

Titles are not showing after the home screen. I have put UITabBarController after the first screen. First screen hasn't got a UITabBarController. I am not sure the way I have implemented the tab.
I have set titles in every view controller by self.title = #"title". Titles are showing in tab items properly.
AppDelegate.m:
UIViewController *loginView= [[[LoginViewController alloc] initWithNibName:#"LoginViewController" bundle:nil] autorelease];
UINavigationController *loginViewNavController = [[UINavigationController alloc] initWithRootViewController:loginView ];
self.navigationController = loginViewNavController;
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
LoginViewController.m:
-(IBAction)navigateMainMenu:(id)sender{
tabBarController = [[UITabBarController alloc] init];
MyAccountsViewController *vc1 = [[MyAccountsViewController alloc] initWithNibName:#"MyAccountsViewController" bundle:nil];
DepositsViewController *vc2 = [[DepositsViewController alloc] initWithNibName:#"DepositsViewController" bundle:nil];
MoreViewController *vc3 = [[MoreViewController alloc] initWithNibName:#"MoreViewController" bundle:nil];
PayTransViewController *vc4 = [[PayTransViewController alloc]init];
NSArray* controllers = [NSArray arrayWithObjects:vc1,vc4, vc2, vc3, nil];
tabBarController.viewControllers = controllers;
[self.navigationController pushViewController:tabBarController animated:YES];
[mainMenuViewController release];
If you set self.title = #"Title". This title will set in navController title. But In your TabBarController, every items are ViewController. Not an navigationController.
Issue: What you release in this line
[mainMenuViewController release];
mostly display title with bellow trickes :-
1. Self.title=#"Your Titile";
2. self.navigationItem.title=#"your Title";
3. when you using UItabBarController you can set Particular Viewcontroller as par your code Title like:-
vc1.title=#"your Title";
vc2.title=#"your Title";
vc3.title=#"your Title";
vc4.title=#"your Title";
I suggest you not you use tabbarcontroller inside a navigationcontroller. If you are using tabbarcontroller it should be the rootViewcontroller.

Keeping a UITabbarController visible in every view

I have an app with a custom UITabBarController that contains five view controllers. Within each of these view controllers, other view controllers can be accessed. Ideally, I would like my custom UITabBarController to appear in each ViewController-regardless on whether or not the view controller originates directly from the tabbar.
I think this can be accomplished using a Navigation Controller within each of the original five view controllers, however, is there a way to just add the custom UITabBarController to each view controller? I tried doing this by the following ways in my viewDidLoad methods:
AppDelegate *appDelegate = [(AppDelegate *)[UIApplication sharedApplication] delegate];
tabbarController = appDelegate.tabBarController;
tabbarController.view.frame = CGRectMake(0, 0, 320, 480);
[self.view addSubview:tabbarController.view];
but I get a bad_access in my app delegate when I run the code.
Any thoughts?
As you correctly stated, using 'UINavigationController's as root controllers of each tab will achieve what you are trying to do.
Here is an example of how to easily setup your tabbar with navigation controllers:
- (void)setupTabBar {
// Create nav-controller for local use
UINavigationController *localNavController;
// New tabbar controller and array to contain the view controllers
UITabBarController * theTabBarController = [[UITabBarController alloc] init];
NSMutableArray *localViewControllersArray = [[NSMutableArray alloc] initWithCapacity:4];
/*--------------------------------------------------------------------
* Setup the view controllers for the different tabs
*-------------------------------------------------------------------*/
// Root view controller for Tab 1
UIViewController *vc;
vc = [[ViewController1 alloc] initWithNibName:#"ViewController1" bundle:nil];
localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
localNavController.tabBarItem.image = [UIImage imageNamed:#"image.png"];
localNavController.tabBarItem.title = #"Tab1";
// Add navigation controller to the local vc array (1 of 4)
[localViewControllersArray addObject:localNavController];
// Root view controller for Tab 2
vc = [[ViewController2 alloc] initWithNibName:#"ViewController2" bundle:nil];
localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
localNavController.tabBarItem.image = [UIImage imageNamed:#"image.png"];
localNavController.tabBarItem.title = #"Tab2";
// Add navigation controller to the local vc array (2 of 4)
[localViewControllersArray addObject:localNavController];
// Root view controller for Tab 3
vc = [[ViewController3 alloc] initWithNibName:#"ViewController3" bundle:nil];
localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
localNavController.tabBarItem.image = [UIImage imageNamed:#"image.png"];
localNavController.tabBarItem.title = #"Tab3";
// Add navigation controller to the local vc array (3 of 4)
[localViewControllersArray addObject:localNavController];
// Root view controller for Tab 4
vc = [[ViewController4 alloc] initWithNibName:#"ViewController4" bundle:nil];
localNavController = [[UINavigationController alloc] initWithRootViewController:vc];
localNavController.tabBarItem.image = [UIImage imageNamed:#"image.png"];
localNavController.tabBarItem.title = #"Tab4";
// Add navigation controller to the local vc array (4 of 4)
[localViewControllersArray addObject:localNavController];
// Point the tab bar controllers view controller array to the array
// of view controllers we just populated
theTabBarController.viewControllers = localViewControllersArray;
self.tabBarController = theTabBarController;
[self.window setRootViewController:self.tabBarController];
...
}
Hope this helps :)
Your AppDelegate should have one TabBarController. This TabBarController holds an array of ViewControllers (tabBarController.viewControllers).
These ViewControllers should be UINavigation Controllers.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UINavigationController* navController1 = [[UINavigationController alloc] initWithRootViewController:firstOfYourControllers;
UINavigationController* navController2 = [[UINavigationController alloc] initWithRootViewController:sencondOfYourViewControllers;
UINavigationController* navController3 = [[UINavigationController alloc] initWithRootViewController:andSoOn;
UINavigationController* navController4 = [[UINavigationController alloc] initWithRootViewController:andSoOn;
UINavigationController* navController5 = [[UINavigationController alloc] initWithRootViewController:andSoOn;
NSArray* viewControllerArray = [NSArray arrayWithObjects:navController1, navController2, navController3, navController4, navController5, nil];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = viewControllerArray;
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Do not present your NavigationControllers modally. They will be presented on top of your TabBarController and the TabBarController won't be visible anymore. Do also not try to present a TabBarController in a NavigationController.

Problems with UINavigation controller inside of UITabbarcontroller

I have an UITabbarcontroller with 4 tabbar items.Each tabbar items have UINavigationController.Actually Tabbar loads the last view controller from stack while i switch next tabbar item.
I want to load the first view controller from the stack whenever i switch between the tabbar item.
How can i achieve this?
You want it to go back to the root view controller within each tab, rather than remembering where in the hierarchy the user was, whenever you switch tabs?
You need to call popToRootViewControllerAnimated:NO on the navigation controller as you switch tabs (i.e. in a tab bar controller delegate method).
The best approach you may follow is :
Appdelegate.h
UITabBarController *tabBarController;
// set properties
Appdelegate.m
// Synthsize
tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate=self;
//Adding Search,Nearby,Map,AboutUs,Favorites Tabs to tabBarController
Search * search = [[Search alloc] init];
UINavigationController *searchNav = [[UINavigationController alloc] initWithRootViewController:search];
Nearby* nearby = [[Nearby alloc] init];
UINavigationController *nearbyNav = [[UINavigationController alloc] initWithRootViewController:nearby];
Map* map = [[Map alloc] init];
UINavigationController *mapNav = [[UINavigationController alloc] initWithRootViewController:map];
AboutUs* aboutUs = [[AboutUs alloc] init];
UINavigationController *aboutUsNav = [[UINavigationController alloc] initWithRootViewController:aboutUs];
Favorites* favorites = [[Favorites alloc] init];
UINavigationController *favoritesNav = [[UINavigationController alloc] initWithRootViewController:favorites];
NSArray* controllers = [NSArray arrayWithObjects:searchNav,nearbyNav,mapNav,aboutUsNav,favoritesNav, nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
You can accordingly manage in which tab you want to place navigation controller or only a view controller.
Then in each of the view controllers mentioned above you need to implement
- (id)init {}
in which you can set Tab name and image.
Hope this helps.

Complex multiview iphone ios

i need to implement a multiview app really complex to me and i need some advice. The multiview app is something like:
First view: Normal UIViewController with one button, when i push it go to second view
Second view(aka mainview): a Windows with Tab Bar with 2 tabbar item who switch between:
Second view A: Normal UIViewController with some elements
Second view B: UITableViewController
Can someone give me an advice where to start reading or some examples?
thx
my advice is to read sample code form apple there you can also find coding how to s so good luck, or you can find example codes all over the stack just search. for example navigation based app:
UINavigationController doesn't work in a the moreNavigationController of a UITabBarController
or simple transition:
SecondViewController *screen = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
screen.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:screen animated:YES];
[screen release];
hope it helps bye
wblade
You need to start with view based application. And then create a UITabbarController in you appDelegate file.
Appdelegate.h
UITabBarController *tabBarController;
// set properties
Appdelegate.m
// Synthsize
tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate=self;
//Adding Search,Nearby,Map,AboutUs,Favorites Tabs to tabBarController
Search * search = [[Search alloc] init];
UINavigationController *searchNav = [[UINavigationController alloc] initWithRootViewController:search];
Nearby* nearby = [[Nearby alloc] init];
UINavigationController *nearbyNav = [[UINavigationController alloc] initWithRootViewController:nearby];
Map* map = [[Map alloc] init];
UINavigationController *mapNav = [[UINavigationController alloc] initWithRootViewController:map];
AboutUs* aboutUs = [[AboutUs alloc] init];
UINavigationController *aboutUsNav = [[UINavigationController alloc] initWithRootViewController:aboutUs];
Favorites* favorites = [[Favorites alloc] init];
UINavigationController *favoritesNav = [[UINavigationController alloc] initWithRootViewController:favorites];
NSArray* controllers = [NSArray arrayWithObjects:searchNav,nearbyNav,mapNav,aboutUsNav,favoritesNav, nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
You can accordingly manage in which tab you want to place navigation controller or only a view controller.
Then in each of the view controllers mentioned above you need to implement
- (id)init {}
in which you can set Tab name and image.