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. 从运行结果可知,一个标签控制器下可以管理导航控制器,导航控制器下也可以管理标签控制器,但是标签控制器最好不要再管理一个标签控制器。

 

posted @ 2014-10-21 21:25  _蚕豆_  阅读(214)  评论(0)    收藏  举报