一、视图切换
- UITabBarController (分页控制器) - 平行管理视图
- UINavigationController (导航控制器) - 压栈出栈管理视图
- 模态窗口
二、UITabBarController分页控制器
-
是为了利用 页签切换视图 设计的控制器UITabBarController
- 该控制器有一个
控件,用户通过点击UITabBar
进行视图切换UITabBar
-
本身会不显示任何视图,它只是一个 容器控制器UITabBarController
- 为了减少视图间的耦合,所有
的子视图的相关标题、图标等信息由子视图自己控制UITabBarController
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYzMwkjN1ITM10iMyQDO0IDNwEDNwQDM2EDMy0iMwEDOykzLcRDM2EDMy8CXyATM4ITOvw1ZvxmYvwVbvNmLzd2bsJmbj5SNxAjMzV2Zh1Wavw1LcpDc0RHaiojIsJye.png)
注意事项:
会一次性初始化所有子控制器,但默认只加载第一个控制器视图
UITabBarController
- 每个视图控制器都有一个
属性,用它来访问所在的
tabBarController
UITabBarController
- 每个视图控制器都有一个
属性,用它来控制
tabBarItem
的
UITabBarController
上的显示信息
UITabBar
的
tarBarItem
属性必须是
image
格式,并且打开
png
通道 ,否则无法正常显示
alpha
UITabBarController
通常是作为整个程序的
rootViewController
的,我们需要在程序的
window
显示之前就创建好它。
具体步骤如下:
- 创建一个
对象
UITabBarController
- 创建
中每一个tab对应的要显示的对象
UITabBarController
viewController
- 通过
的
UITabBarController
属性将要显示的所有
viewControllers
添加到
viewController
中
UITabBarController
- 通过设置
对象为
UITabBarController
,然后显示
window.rootViewController
window
//a.初始化一个tabBar控制器
UITabBarController *tarbarVC = [[UITabBarController alloc] init];
//设置控制器为Window的根控制器
self.window.rootViewController = tarbarVC;
//b.创建子控制器
UIViewController *c1 = [[UIViewController alloc] init];
c1.view.backgroundColor = [UIColor grayColor];
c1.view.backgroundColor=[UIColor greenColor];
c1.tabBarItem.title = @"消息";
c1.tabBarItem.image = [UIImage imageNamed:@"tab_recent_nor"];
c1.tabBarItem.badgeValue = @"123";
UIViewController *c2 = [[UIViewController alloc] init];
c2.view.backgroundColor = [UIColor brownColor];
c2.tabBarItem.title = @"联系人";
c2.tabBarItem.image = [UIImage imageNamed:@"tab_buddy_nor"];
UIViewController *c3 = [[UIViewController alloc] init];
c3.tabBarItem.title = @"动态";
c3.tabBarItem.image = [UIImage imageNamed:@"tab_qworld_nor"];
UIViewController *c4 = [[UIViewController alloc] init];
c4.tabBarItem.title = @"设置";
c4.tabBarItem.image = [UIImage imageNamed:@"tab_me_nor"];
//c.添加子控制器到ITabBarController中
tarbarVC.viewControllers = @[c1,c2,c3,c4];
//d.设置Window为主窗口并显示出来
[self.window makeKeyAndVisible];
UITabBarControllerDelegate代理
#pragma mark 该方法用于控制TabBarItem能不能选中
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
改变UITabBarController当前显示视图的方法
- 改变selectedIndex属性
- 改变selectedViewController属性
- 改变viewControllers属性
三、UINavigationController导航控制器
-
中的子控制器以栈的形式存储,只有在栈顶部的控制器才能显示在界面上UINavigationController
- 压栈
,出栈pushController
popController
-
必须有一个根控制器UINavigationController
rootViewController
- 子控制器通过
属性访问navigationController
UINavigationController
- 在栈中的子控制器都有一个导航栏
,通过navigationBar
去控制navigationItem
iOS学习笔记04-视图切换
UINavigationItem属于MVC中的Model,封装了要显示在UINavigationBar上的数据:
: 标题
title
:标题视图
titleView
:左按钮
leftBarButtonItem
:右按钮
rightBarButtonItem
下一个子视图左侧返回按钮的标题优先级:
leftBarButtonItem
- 导航栏返回按钮
的标题
backBarButtonItem
- 导航栏
的标题
navigationItem
- 视图控制器的标题
UINavigationController常用的主要方法:
#pragma mark 压栈,把控制器压入导航控制器子控制器栈中
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 出栈,把导航控制器子控制器栈的栈顶弹出
- (void)popViewControllerAnimated:(BOOL)animated;
#pragma mark 多次出栈直到栈顶为指定控制器
- (void)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 多次出栈直到栈顶为根控制器
- (void)popToRootViewControllerAnimated:(BOOL)animated;
四、模态窗口
#pragma mark 从下方弹出指定的视图控制器,赋予模态,即当前视图关闭前,其他视图上的内容无法操作
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
#pragma mark 关闭模态窗口,该方法在模态窗口中调用
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion;