- Create a tab bar Controller programmatically
- Associate view controllers to the tab bar controllers
- Customize the look and feel of the tabs such as background color, text fonts, etc.
- Set the title and image icons for the tab bar items
- Go to a specific tab programmatically using a button click
For this example just create a New Project with the empty application template and then create 3 separate view controllers that represent our screens for display.
Interface file for the application delegate - MyTabViewAppDelegate.h
#import <UIKit/UIKit.h> #import "MyUITabBarController.h" #import "FirstViewController.h" #import "SecondViewController.h" @interface MyTabViewAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) MyUITabBarController *tabBarController; @property (strong, nonatomic) FirstViewController *firstViewController; @property (strong, nonatomic) SecondViewController *secondViewController; @end
Implementation file for the application delegate - MyTabViewAppDelegate.m
#import "MyTabViewAppDelegate.h" @implementation MyTabViewAppDelegate @synthesize tabBarController; @synthesize firstViewController, secondViewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; //create the view controller for the first tab self.firstViewController = [[FirstViewController alloc] initWithNibName:nil bundle:NULL]; //create the view controller for the second tab self.secondViewController = [[SecondViewController alloc] initWithNibName:nil bundle:NULL]; //create an array of all view controllers that will represent the tab at the bottom NSArray *myViewControllers = [[NSArray alloc] initWithObjects: self.firstViewController, self.secondViewController, nil]; //initialize the tab bar controller self.tabBarController = [[MyUITabBarController alloc] init]; //set the view controllers for the tab bar controller [self.tabBarController setViewControllers:myViewControllers]; //add the tab bar controllers view to the window [self.window addSubview:self.tabBarController.view]; //set the window background color and make it visible self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } - (void)applicationWillResignActive:(UIApplication *)application { //do nothing } - (void)applicationDidEnterBackground:(UIApplication *)application { //do nothing } - (void)applicationWillEnterForeground:(UIApplication *)application { //do nothing } - (void)applicationDidBecomeActive:(UIApplication *)application { //do nothing } - (void)applicationWillTerminate:(UIApplication *)application { //do nothing } @end
Interface file for the custom UITabBarController - MyUITabBarController.h
#import <UIKit/UIKit.h> @interface MyUITabBarController : UITabBarController @end
Implementation file for the custom UITabBarController - MyUITabBarController.m
#import "MyUITabBarController.h" @interface MyUITabBarController () @end @implementation MyUITabBarController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; //create a custom view for the tab bar CGRect frame = CGRectMake(0.0, 0.0, self.view.bounds.size.width, 48); UIView *v = [[UIView alloc] initWithFrame:frame]; [v setBackgroundColor:[UIColor greenColor]]; [v setAlpha:0.5]; [[self tabBar] addSubview:v]; //set the tab bar title appearance for normal state [[UITabBarItem appearance] setTitleTextAttributes:@{UITextAttributeTextColor : [UIColor whiteColor], UITextAttributeFont:[UIFont boldSystemFontOfSize:16.0f]} forState:UIControlStateNormal]; //set the tab bar title appearance for selected state [[UITabBarItem appearance] setTitleTextAttributes:@{ UITextAttributeTextColor : [UIColor blueColor], UITextAttributeFont:[UIFont boldSystemFontOfSize:16.0f]} forState:UIControlStateHighlighted]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
Interface file for the first View - FirstViewController.h
#import <UIKit/UIKit.h> @interface FirstViewController : UIViewController @end
Implementation file for the first View - FirstViewController.m
#import "FirstViewController.h" @interface FirstViewController () @end @implementation FirstViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; NSLog(@"Initialize the first Tab"); if (self) { //set the title for the tab self.title = @"First Tab"; //set the image icon for the tab self.tabBarItem.image = [UIImage imageNamed:@"first.png"]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"View is displayed for the first Tab"); //just display some text so that we know what view we are in UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 300, 100)]; myLabel.text = @"First View Controller"; myLabel.font = [UIFont boldSystemFontOfSize:24.0f]; [self.view addSubview:myLabel]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
Interface file for the second view - SecondViewController.h
#import <UIKit/UIKit.h> #import "LastViewController.h" @interface SecondViewController : UIViewController @property (strong, nonatomic) LastViewController *lastViewController; @end
Implementation file for the second view - SecondViewController.m
#import "SecondViewController.h" @interface SecondViewController () @end @implementation SecondViewController @synthesize lastViewController; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; NSLog(@"Initialize the second Tab"); if (self) { self.title = @"Second Tab"; self.tabBarItem.image = [UIImage imageNamed:@"second.png"]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"View is displayed for the second Tab"); //just display some text so that we know what view we are in UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 300, 100)]; myLabel.text = @"Second View Controller"; myLabel.font = [UIFont boldSystemFontOfSize:24.0f]; [self.view addSubview:myLabel]; //create a button so that when the user taps it we will generate a new //tab programmatically UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; myButton.frame = CGRectMake(85.0f, 100.0f, 150.0f, 37.0f); [myButton setTitle:@"Add another Tab" forState:UIControlStateNormal]; [myButton addTarget:self action:@selector(checkButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:myButton]; } - (void) checkButtonClick:(UIButton *)paramSender{ UIButton *myButton = paramSender; //check which button was tapped if([myButton.currentTitle isEqualToString:@"Add another Tab"]){ NSLog(@"Clicked on the button"); //if the last view controller doesn't exists create it if(self.lastViewController == nil){ LastViewController *lastView = [[LastViewController alloc] init]; self.lastViewController = lastView; //Get the current array of View Controllers NSArray *currentControllers = self.tabBarController.viewControllers; //Create a mutable array out of this array NSMutableArray *newControllers = [NSMutableArray arrayWithArray:currentControllers]; //add another view controller to the mutable array [newControllers addObject:lastViewController]; //Assign the manipulated array to the tab bar Controller with animation [self.tabBarController setViewControllers:newControllers animated:YES]; //display the tab that was just added [self.tabBarController setSelectedIndex:(newControllers.count -1)]; } } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
Interface file for the last view - LastViewController.h
#import <UIKit/UIKit.h> @interface LastViewController : UIViewController @end
Implementation file for the last view - LastViewController.m
#import "LastViewController.h" @interface LastViewController () @end @implementation LastViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; NSLog(@"Initialize the last Tab"); if (self) { self.title = @"Just added"; } return self; } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"View is displayed for the last Tab"); UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 300, 100)]; myLabel.text = @"Last View Controller"; myLabel.font = [UIFont boldSystemFontOfSize:24.0f]; [self.view addSubview:myLabel]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
No comments:
Post a Comment
NO JUNK, Please try to keep this clean and related to the topic at hand.
Comments are for users to ask questions, collaborate or improve on existing.