天天看点

iOS学习笔记04-视图切换

一、视图切换

  • UITabBarController (分页控制器) - 平行管理视图
  • UINavigationController (导航控制器) - 压栈出栈管理视图
  • 模态窗口

二、UITabBarController分页控制器

  1. UITabBarController

    是为了利用 页签切换视图 设计的控制器
  2. 该控制器有一个

    UITabBar

    控件,用户通过点击

    UITabBar

    进行视图切换
  3. UITabBarController

    本身会不显示任何视图,它只是一个 容器控制器
  4. 为了减少视图间的耦合,所有

    UITabBarController

    的子视图的相关标题、图标等信息由子视图自己控制
iOS学习笔记04-视图切换

注意事项:

  • UITabBarController

    会一次性初始化所有子控制器,但默认只加载第一个控制器视图
  • 每个视图控制器都有一个

    tabBarController

    属性,用它来访问所在的

    UITabBarController

  • 每个视图控制器都有一个

    tabBarItem

    属性,用它来控制

    UITabBarController

    UITabBar

    上的显示信息
  • tarBarItem

    image

    属性必须是

    png

    格式,并且打开

    alpha

    通道 ,否则无法正常显示

UITabBarController

通常是作为整个程序的

rootViewController

的,我们需要在程序的

window

显示之前就创建好它。

具体步骤如下:

  1. 创建一个

    UITabBarController

    对象
  2. 创建

    UITabBarController

    中每一个tab对应的要显示的对象

    viewController

  3. 通过

    UITabBarController

    viewControllers

    属性将要显示的所有

    viewController

    添加到

    UITabBarController

  4. 通过设置

    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当前显示视图的方法

  1. 改变selectedIndex属性
  2. 改变selectedViewController属性
  3. 改变viewControllers属性

三、UINavigationController导航控制器

  1. UINavigationController

    中的子控制器以栈的形式存储,只有在栈顶部的控制器才能显示在界面上
  2. 压栈

    pushController

    ,出栈

    popController

  3. UINavigationController

    必须有一个根控制器

    rootViewController

  4. 子控制器通过

    navigationController

    属性访问

    UINavigationController

  5. 在栈中的子控制器都有一个导航栏

    navigationBar

    ,通过

    navigationItem

    去控制
    iOS学习笔记04-视图切换

UINavigationItem属于MVC中的Model,封装了要显示在UINavigationBar上的数据:

title

: 标题

titleView

:标题视图

leftBarButtonItem

:左按钮

rightBarButtonItem

:右按钮
下一个子视图左侧返回按钮

leftBarButtonItem

的标题优先级:
  1. 导航栏返回按钮

    backBarButtonItem

    的标题
  2. 导航栏

    navigationItem

    的标题
  3. 视图控制器的标题

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;