UIKit框架中有各种Bar,UITabBar、UINavigationBar、UIToolbar。Bar对应的就有一些Item,tabBarItem、navigationItem、toolbarItems,再加上UIViewController、UINavigationController、UITabBarController很容易搞糊涂。我看了好久,没看明白。动手敲了下才有一点感觉。
一、联系
一个UINavigationController对应着一个UINavigationBar、UIToolbar,UIToolbar默认不显示,toolbarHidden=NO时显示。一个UITabBarController对应着一个UITabBar.一个UIViewController对应着一个tabBarItem、navigationItem和多个toolbarItems。navigationItem中可以设置左右按钮和中间视图等。
二、代码demo
1.首先代码结构 viewController1-viewController5用于生成5个tabBarItem。viewController、viewController6主要模拟登录注册,有时候需要先让用户登录注册之后才能进入。
2.代码
1.在AppDelegate.m中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {tabBarViewController *tabVc=[[tabBarViewController alloc]init];[self.window makeKeyAndVisible];self.window.backgroundColor=[UIColor whiteColor];self.window.rootViewController=tabVc;return YES;
}
2.ViewController.m
//
// ViewController.m
// UITabBarController
//
// Created by City--Online on 15/5/26.
// Copyright (c) 2015年 XQB. All rights reserved.
//#import "ViewController.h"
#import "ViewController6.h"@interface ViewController ()@end
@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];NSLog(@"%@ %@",NSStringFromCGRect(self.tabBarController.tabBar.frame),NSStringFromCGRect(self.navigationController.toolbar.frame));UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];btn.frame=CGRectMake(100, 100, 100, 100);[btn setTitle:@"按钮" forState:UIControlStateNormal];[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];UIBarButtonItem *item1=[[UIBarButtonItem alloc]initWithBarButtonSystemItem: UIBarButtonSystemItemDone target:self action:nil];self.toolbarItems=@[item1];
}
-(void)btnClick:(id)sender
{ViewController6 *vc6=[[ViewController6 alloc]init];vc6.title=@"第6页";vc6.hidesBottomBarWhenPushed=YES;[self.navigationController pushViewController:vc6 animated:YES];
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}
@end
3.ViewController1.m
//
// ViewController1.m
// UITabBarController
//
// Created by City--Online on 15/5/26.
// Copyright (c) 2015年 XQB. All rights reserved.
//#import "ViewController1.h"
#import "ViewController2.h"@interface ViewController1 ()@end@implementation ViewController1- (void)viewDidLoad {[super viewDidLoad];}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}
@end
4.ViewController2.m
//
// ViewController2.m
// UITabBarController
//
// Created by City--Online on 15/5/26.
// Copyright (c) 2015年 XQB. All rights reserved.
//#import "ViewController2.h"
#import "ViewController.h"
#import "navigationViewController.h"@interface ViewController2 ()@end@implementation ViewController2- (void)viewDidLoad {[super viewDidLoad];ViewController *vc=[[ViewController alloc]init];
// navigationViewController *nav=[[navigationViewController alloc]initWithRootViewController:vc];
// self.navigationController.toolbarHidden=NO;
// nav.toolbarHidden=NO;[self.navigationController addChildViewController:vc];}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end
5.ViewController6.m
//
// ViewController6.m
// UITabBarController
//
// Created by City--Online on 15/5/26.
// Copyright (c) 2015年 XQB. All rights reserved.
//#import "ViewController6.h"@interface ViewController6 ()@end@implementation ViewController6- (void)viewDidLoad {[super viewDidLoad];NSLog(@"%@ %@",NSStringFromCGRect(self.tabBarController.tabBar.frame),NSStringFromCGRect(self.navigationController.toolbar.frame));UIBarButtonItem *item1=[[UIBarButtonItem alloc]initWithBarButtonSystemItem: UIBarButtonSystemItemAdd target:self action:@selector(btnClick:)];self.toolbarItems=@[item1];
}
-(void)btnClick:(id)sender
{[self.navigationController popToRootViewControllerAnimated:YES];
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end
6.tabBarViewController.m继承UITabBarController
//
// tabBarViewController.m
// UITabBarController
//
// Created by City--Online on 15/5/26.
// Copyright (c) 2015年 XQB. All rights reserved.
//#import "tabBarViewController.h"
#import "ViewController.h"
#import "ViewController1.h"
#import "ViewController2.h"
#import "ViewController3.h"
#import "ViewController4.h"
#import "ViewController5.h"
#import "navigationViewController.h"@interface tabBarViewController ()<UITabBarControllerDelegate>@end@implementation tabBarViewController- (void)viewDidLoad {[super viewDidLoad];[self steup];self.delegate=self;self.selectedIndex=2;self.moreNavigationController.tabBarItem=[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemRecents tag:1001];self.moreNavigationController.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"编辑" style:UIBarButtonItemStyleDone target:self action:nil];self.moreNavigationController.visibleViewController.navigationItem.title=@"更多功能";self.moreNavigationController.visibleViewController.navigationItem.rightBarButtonItem.title=@"编辑";}
-(void)rightClick:(id)sender
{}
-(void)steup
{ViewController *vc=[[ViewController alloc]init];vc.title=@"第0页";navigationViewController *nvc=[[navigationViewController alloc]initWithRootViewController:vc];nvc.toolbarHidden=NO;UITabBarItem *tabBarItem=[[UITabBarItem alloc]initWithTitle:@"第0页" image:[UIImage imageNamed:@"tabbar_homepage_normal"] selectedImage:[UIImage imageNamed:@"tabbar_homepage_selected"]];tabBarItem.badgeValue=@"2";nvc.tabBarItem=tabBarItem;ViewController1 *vc1=[[ViewController1 alloc]init];vc1.title=@"第1页";navigationViewController *nvc1=[[navigationViewController alloc]initWithRootViewController:vc1];nvc1.tabBarItem=[[UITabBarItem alloc]initWithTitle:@"第1页" image:[UIImage imageNamed:@"tabbar_convenience_normal"] selectedImage:[UIImage imageNamed:@"tabbar_convenience_selected"]];ViewController2 *vc2=[[ViewController2 alloc]init];vc2.title=@"第2页";navigationViewController *nvc2=[[navigationViewController alloc]initWithRootViewController:vc2];nvc2.toolbarHidden=NO;nvc2.tabBarItem=[[UITabBarItem alloc]initWithTitle:@"第2页" image:[UIImage imageNamed:@"tabbar_electrice_commerce_normal"] selectedImage:[UIImage imageNamed:@"tabbar_electrice_commerce_selected"]];ViewController3 *vc3=[[ViewController3 alloc]init];vc3.title=@"第3页";navigationViewController *nvc3=[[navigationViewController alloc]initWithRootViewController:vc3];vc3.tabBarItem=[[UITabBarItem alloc]initWithTitle:@"第3页" image:[UIImage imageNamed:@"tabbar_me_normal"] selectedImage:[UIImage imageNamed:@"tabbar_me_selected"]];ViewController4 *vc4=[[ViewController4 alloc]init];vc4.title=@"第4页";navigationViewController *nvc4=[[navigationViewController alloc]initWithRootViewController:vc4];nvc4.tabBarItem=[[UITabBarItem alloc]initWithTitle:@"第4页" image:[UIImage imageNamed:@"tabbar_convenience_normal"] selectedImage:[UIImage imageNamed:@"tabbar_convenience_selected"]];ViewController5 *vc5=[[ViewController5 alloc]init];vc5.title=@"第5页";navigationViewController *nvc5=[[navigationViewController alloc]initWithRootViewController:vc5];nvc5.tabBarItem=[[UITabBarItem alloc]initWithTitle:@"第5页" image:[UIImage imageNamed:@"tabbar_homepage_normal"] selectedImage:[UIImage imageNamed:@"tabbar_homepage_selected"]];// 默认的顺序NSArray *defaultarr=@[nvc,nvc1,nvc2,nvc3,nvc4,nvc5];// 自定义的顺序NSMutableArray *newarr=[[NSMutableArray alloc]init];//获取保存的title数组NSArray *titles=[[NSUserDefaults standardUserDefaults] arrayForKey:@"vcs"];// 第一次启动为nilif (titles==nil) {newarr=[defaultarr copy];}//根据自定义title数组 设置newarr数组for (NSString *s in titles) {for (navigationViewController *nvc in defaultarr) {if ([s isEqualToString:nvc.visibleViewController.title]) {[newarr addObject:nvc];}}}self.viewControllers=newarr;}
//UITabBarControllerDelegate
//是否可以选中
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{return YES;
}
//选中某个viewController
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
// NSLog(@"%@",viewController.title);
}
//开始自定义viewControllers
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers
{NSLog(@"%@",viewControllers);
}
//即将编辑结束
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{NSLog(@"%d",changed);
}
//编辑结束
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{//记下选择的选项顺序,方便下次启动时显示NSMutableArray *arr=[[NSMutableArray alloc]init];if (!changed) {return;}for (UIViewController *vc in viewControllers) {[arr addObject:vc.title];}NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];[defaults setObject:arr forKey:@"vcs"];}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end
7.navigationViewController.m
//
// navigationViewController.m
// UITabBarController
//
// Created by City--Online on 15/5/26.
// Copyright (c) 2015年 XQB. All rights reserved.
//#import "navigationViewController.h"@interface navigationViewController ()<UINavigationControllerDelegate>@end@implementation navigationViewController- (void)viewDidLoad {[super viewDidLoad];
// if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
// {
// self.edgesForExtendedLayout = UIRectEdgeNone;
// }self.navigationController.navigationBar.translucent=NO;self.delegate=self;}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{NSLog(@"%@",viewController.title);
}
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end
实现效果: