今天又是周五了一天天的过得好快,这句总是情不自禁的感叹!下面给大家分享下视图的切换,其实这是我们的基本功,只是有时候面试了或者同事交流的时候感觉回答的不够系统,全面。
我们常见的视图切换有人说三种,有人说四种,我就把平时用到的都总结下:
UIViewController、UINavigationController, UITabBarController之间的关系
UIViewController 是所有控制器的基类,UINavigationController, UITabBarController 都是直接或间接继承自UIViewController. 只是它们在UIVIewController的基础上又扩展了自己的实现。
UINavigationController: 导航控制器, 它是一个容器控制器,自身实现了它包含的所有子控制器之间的转场。 pushViewController(压栈) ,popViewController(出栈)。可见导航控制器,它维护了一个控制器栈,控制器之间的关系也符合栈的特点“后进先出”。 UITabBarController: 标签控制器, 它也是一个容器控制器,以平行的方式管理视图。
常见的视图切换
- 1 UINavigationController 的push、pop
UINavigationController 以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,出栈后的视图会立即销毁,默认显示一个根控制器,根控制器是不会被销毁的,这个根视图必须指定,通过根控制器导航到其他下一级子视图。在子视图中可以通过navigationController访问导航控制器,同时可以通过navigationController的childViewControllers获得当前栈中所有的子视图(注意每一个出栈的子视图都会被销毁)。UINavigationController导航是通过上方导航栏进行的,每个放到UINavigationController栈中的子视图都会显示一个导航栏,可以通过子控制器(包括根控制器) 的navigationItem访问这个导航栏,修改其左右两边的按钮内容。
- 2 UITabBarController
UITabBarController以平行的方式管理视图,各个视图之间往往关系并不大,每个加入到UITabBarController的视图都会进行初始化即使当前不显示在界面上,相对比较占用内存。是Apple专门为了利用页签切换视图而设计的,在这个视图控制器中有一个UITabBar控件,用户通过点击tabBar进行视图切换。我们知道在UIViewController内部有一个视图,一旦创建了UIViewController之后默认就会显示这个视图,但是UITabBarController本身并不会显示任何视图,如果要显示视图则必须设置其viewControllers属性(它默认显示viewControllers[0])。这个属性是一个数组,它维护了所有UITabBarController的子视图。为了尽可能减少视图之间的耦合,所有的UITabBarController的子视图的相关标题、图标等信息均由子视图自己控制,UITabBarController仅仅作为一个容器存在。
- 3 切换window的rootViewController
self.window.rootViewController=viewController; //从一个界面弹到另一个界面,直接设置根视图
- 4 modal模态弹出
[self presentViewController:ViewController animated:YES completion:nil]; //跳转到ViewController所在视图
[self dismissModalViewControllerAnimated:YES]; //退出当前视图
- 5 将另一个控制器的视图添加为当前控制器视图的子视图
[self.view addSubview: ViewController.View]; //实现复杂界面的时候常用
切换制图控制器方式之间优点和缺点
-
1、push、pop方式
优点:控制器切换是可逆的,且最初的根视图不会销毁
缺点:依赖于UINavigationController,故需要有一个导航控制器,与某些界面不需要导航控制器有可能会冲突
push操作是可逆的,即控制器的切换时可逆的。 -
2、modal
优点:控制器切换是可逆的,且原始图不会销毁
缺点:跳转没有push方式自由,dismiss方式只能按顺序返回,不能跳跃, 从前一个modal到后一个时候,前一个控制器不会消失,一直在内存中 -
3、切换window的rootViewController
优点:跳转直接迅速,而且可以销毁前一个控制器,因为将window的强引用改为当前控制器,故前一个控制器会消失(ARC环境)
缺点:视图跳转不可逆 -
4、将一个控制器的视图添加到当前视图上面
优点:通过一个控制器将另一控制器设置为属性,自由读取其他控制器中的视图从而能够实现复杂UI界面
缺点:复杂,多数场合不适用 -
5 tabBar
优点: UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就是QQ、微信等应⽤,所有的UITabBarController的子视图的相关标题、图标等信息均由子视图自己控制,UITabBarController仅仅作为一个容器存在。
缺点:每个加入到UITabBarController的视图都会进行初始化即使当前不显示在界面上,相对比较占用内存。
比较的项目 | push、pop | modal | 切换窗口的根控制器 | 添加子视图 | UITabBarController |
---|---|---|---|---|---|
销毁资源 | 否 | 否 | 是 | 否 | 否 |
使用场合 | 有导航控制器,需要能够返回前一个视图的情况 | 没有导航控制器的跳转,能返回前一个视图 | 版本新特性或者不需要保留前一个控制器的情况 | 需要实现复杂界面的情况 | 与导航控制器结合使用 |
是否有导航控制器 | 是 | 否 | 否 | 否 | 一般与导航控制器结合使用 |
网友评论