10.20-标签控制器 UITabBarController
标签控制器(TabBarController):
和导航控制器一样也可以集中管理多个页面,但这些页面之间是并列的关系,不像导航控制器那样是一级一级的关系。标签控制器有一个标签栏,高度为50px,位置在最下方。标签栏上的每一个元素代表一个视图控制器,每个元素可以设置标题和图片,但在非选中状态下颜色固定是灰色,选中时为蓝色。不是灰色或蓝色的也会自动转换为灰色或蓝色,若想不是灰色,得自己实现一个标签栏。标签栏最多显示五个元素,如果多于五个元素,从第五个元素开始到最后一个元素都将以...组的形式显示在第五个元素的位置。标签控制器和导航控制器可以相互嵌入,但是一个导航控制器中不能装另一个导航控制器,一个标签控制器最好也不要装另一个标签控制器。如果一个视图控制器处在一个导航控制器之下,而该导航控制器又处在一个标签控制器之下,那么该视图控制器将同时具有导航控制器和标签控制器的中的特点。
今天模仿老师练习了一下标签控制器的使用,我完全通过代码,写了一个标签控制器,该标签控制器管理两个子控制器,一个是普通视图控制器,一个是导航控制器。
1. 在程序启动时创建并加载标签控制器,SecondViewController 是自定义的继承自UIViewController的类,代码如下:
//AppDelegate.m
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 // Override point for customization after application launch. 3 4 _window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 5 //创建一个标签控制器 6 UITabBarController *tabBarCtrl = [[UITabBarController alloc] init]; 7 //创建标签控制器下的一个子控制器,该子控制器又处在一个导航控制器之下。 8 ViewController *viewCtrl = [[ViewController alloc] init]; 9 UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:viewCtrl]; 10 //创建第二个标签控制器下的子控制器。 11 SecondViewController *secCtrl = [[SecondViewController alloc] init]; 12 printf("------1------\n"); 13 //给标签控制器添加子控制器 14 tabBarCtrl.viewControllers = @[secCtrl, navCtrl]; 15 16 //这里注意一下,[SecondViewController viewDidLoad]方法会在打印下面的----2----之前执行,因为给tabBarCtrl添加子控制器时,数组中的第一个元素就是tabBarCtrl的默认显示的第一个视图控制器,因此添加过程中会访问该第一个元素的view属性,这里由于secCtrl 的属性是空,因此会调用[SecondViewController viewDidLoad]。 如果上面的数组反过来添加,则会访问navCtrl的view属性,而不是navCtrl的根视图控制器viewCtrl的view属性,因此就不会执行[ViewController viewDidLoad]方法。 那样-2-,-3-,-4-都在[ViewController viewDidLoad]之前执行。 17 printf("------2------\n"); 18 19 //设置本window的根视图控制器 20 _window.rootViewController = tabBarCtrl; 21 printf("------3------\n"); 22 23 //显示window 24 [_window makeKeyAndVisible]; 25 printf("------4------\n"); 26 //该方法执行完后,便将tabBarCtrl的viewControllers数组中的第一个元素(默认情况下是这样,如果在这里设置了tabBarCtrl的selectIndex的值,那么就选择该值表示的数组元素)加载并显示。如果此时对于tabBarCtrl中的viewControllers数组中除第一个元素和selectIndex值指示的元素外的其他元素,都没有访问过他们各自的view属性,那么是不会加载这些元素的,也就是在显示时将看不到tabBarCtrl下面的标签栏上又对应于这些元素的任何标识。只有在点击标签栏上属于这些元素的位置区域后,这些元素对应的界面才会加载并显示。 27 tabBarCtrl.selectedIndex = 1; 28 printf("------5------\n"); 29 30 return YES; 31 }
2. 标签控制器加载后,将加载显示SecondViewController 和 ViewController对象对应的页面,
//SecondViewController.m
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 printf("%s\n", __func__); 6 self.view.backgroundColor = [UIColor whiteColor]; 7 self.title = @"tabBarPage2"; 8 9 UIButton *present = [UIButton buttonWithType:UIButtonTypeSystem]; 10 present.frame = CGRectMake(100, 200, 100, 30); 11 [present setTitle:@"present" forState:UIControlStateNormal]; 12 [present setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal]; 13 [present addTarget:self action:@selector(didPresentClicked:) forControlEvents:UIControlEventTouchUpInside]; 14 [self.view addSubview:present]; 15 16 self.tabBarItem.badgeValue = @"20"; 17 self.tabBarItem.image = [UIImage imageNamed:@"min"]; 18 self.tabBarItem.title = @"secViewCtrl"; 19 } 20 21 - (void)didPresentClicked: (UIButton *)sender 22 { 23 ThirdViewController *thdViewCtrl = [[ThirdViewController alloc] init]; 24 [self presentViewController:thdViewCtrl animated:YES completion:nil]; 25 }
//ViewController.m
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 printf("%s\n", __func__); 5 6 self.view.backgroundColor = [UIColor whiteColor]; 7 self.title = @"tabBarPage1"; 8 9 UIButton *push = [UIButton buttonWithType:UIButtonTypeSystem]; 10 push.frame = CGRectMake(100, 100, 50, 30); 11 [push setTitle:@"push" forState:UIControlStateNormal]; 12 [push setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 13 [push addTarget:self action:@selector(didPushClicked:) forControlEvents:UIControlEventTouchUpInside]; 14 [self.view addSubview:push]; 15 16 } 17 18 - (void)viewWillAppear:(BOOL)animated 19 { 20 //标签控制器的标签栏是不会随着页面的转换而进行刷新的,除非在每个页面都自己设置了标签栏的样式。这点和导航控制器的导航条不同,导航条会随着页面的跳转而进行刷新,如果一个页面没有设置导航条的内容,则导航条除了默认产生的返回按钮之外,其他什么也没有。 21 self.navigationController.tabBarItem.badgeValue = @"10"; 22 self.navigationController.tabBarItem.image = [UIImage imageNamed:@"max"]; 23 self.navigationController.tabBarItem.title = @"viewCtrl"; 24 }
3. 从运行结果可知,一个标签控制器下可以管理导航控制器,导航控制器下也可以管理标签控制器,但是标签控制器最好不要再管理一个标签控制器。

浙公网安备 33010602011771号