iOS中常用的四种视图切换的方式有UITabBarController、UINavigationController、模态窗口以及添加为子视图的方式
一、简单分析一下各自的原理:
* UITabBarController:以平行的方式管理视图,各个视图之间往往关系并不大,每个加入到UITabBarController的视图都会进行初始化即使当前不显示在界面上,相对比较占用内存。
* UINavigationController:以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,出栈后的视图会立即销毁。
* UIModalController:以模态窗口的形式管理视图,当前视图关闭前其他视图上的内容无法操作。
* 添加为子视图的方式
二、详细介绍
UITabBarController
UITabBarController是Apple专门为了利用页签切换视图而设计的,在这个视图控制器中有一个UITabBar控件,用户通过点击tabBar进行视图切换。我们知道在UIViewController内部有一个视图,一旦创建了UIViewController之后默认就会显示这个视图,但是UITabBarController本身并不会显示任何视图,如果要显示视图则必须设置其viewControllers属性(它默认显示viewControllers[0])。这个属性是一个数组,它维护了所有UITabBarController的子视图。

对于UITabBarController简单总结如下:
* UITabBarController会一次性初始化所有子控制器,但是默认只加载第一个控制器视图,其他视图控制器只初始化默认不会加载,为了能够将其他子控制器也正常显示在Tab bar中我们访问了每个子视图控制器的视图以便调用其视图加载方法(viewDidLoad);当然,既然会调用子视图的初始化方法,当然也可以将视图控制器的tabBarItem属性设置放到init方法中设置,如此则不用再遍历其视图属性了。
* tabBarController与子视图的交流:每个视图控制器都有一个tabBarController属性,通过它可以访问所在的UITabBarController
* 每个视图控制器都有一个tabBarItem属性,通过它控制视图在UITabBarController的tabBar中的显示信息。 tabBarItem的image属性必须是png格式(建议大小32*32)并且打开alpha通道否则无法正常显示。
*
UINavigationController
UINavigationController是一个导航控制器,它用来组织有层次关系的视图,在UINavigationController中子控制器以栈的形式存储,只有在栈顶的控制器能够显示在界面中,一旦一个子控制器出栈则会被销毁。UINavigationController默认也不会显示任何视图(这个控制器自身的UIView不会显示),它必须有一个根控制器rootViewController,而且这个根控制器不会像其他子控制器一样被销毁。

简单总结
* UINavigationController默认显示一个根控制器,,通过根控制器导航到其他下一级子视图。
* 与子视图的沟通:在子视图中可以通过navigationController访问导航控制器,同时可以通过navigationController的childViewControllers获得当前栈中所有的子视图(注意每一个出栈的子视图都会被销毁)。
* UINavigationController导航是通过上方导航栏进行的,每个放到UINavigationController栈中的子视图都会显示一个导航栏,可以通过子控制器(包括根控制器)的navigationItem访问这个导航栏,修改其左右两边的按钮内容。 默认情况下除了根控制器之外的其他子控制器都会在导航栏左侧显示返回按钮,点击可以返回上一级视图,同时按钮标题默认为上一级视图的标题,可以通过backBarButtonItem修改。

模态窗口(模式-视图-控制器)
模态窗口只是视图控制器显示的一种方式(在iOS中并没有专门的模态窗口类),模态窗口不依赖于控制器容器直接通过使用视图控制器来管理不涉及其他视图,通常用于显示独立的内容,在模态窗口显示的时其他视图的内容无法进行操作。

其流程是一次显示一个视图控制器然后从一个视图控制器迁移到另一个。流程如图所示

模态窗口使用起来比较容易,一般的视图控制器只要调用- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_AVAILABLE_IOS(5_0);方法那么参数中的视图控制器就会以模态窗口的形式展现,同时调用- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion NS_AVAILABLE_IOS(5_0);方法就会关闭模态窗口。

添加为子视图
从另一个视图控制器把视图添加到当前视图控制器,作为子视图。如果再添加之前不把前一个删除的话,整个栈上的子视图将难以管理。流程图如下

个人认为如果不需要花哨的效果,又不想让导航条占去屏幕的空间,推荐使用模态窗口

参考:http://www.cnblogs.com/kenshincui/p/3940746.html#autoid-4-0-0
《设计模式》

iOS中视图切换的四种方式相关推荐

  1. ios页面间传递参数四种方式

    ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...

  2. 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators

    Microsoft在最新的C#版本中引入了Source Generator.这是一项新功能,可以让我们在代码编译时生成源代码.在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作.然后,您 ...

  3. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello {public stati ...

  4. 控制器中接收数据的四种方式

    控制器中接收数据的四种方式: (仅限于个别的方式(get/post)有效) 通过形参的方式接收表单提交的数据(可以接收post与get提交的数据): 注释: GetData自己定义的方法名里面存入形参 ...

  5. java中Map遍历的四种方式

    java中Map遍历的四种方式 在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方 ...

  6. java中四种注入注解,Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  7. 解决存储过程中数据安全问题的四种方式

    随着科技的不断发展,数据量也正在呈指数倍的增加.在这样一个大背景下,存储产品成为了时下市场中最热的产品.而数据的安全性也变得尤为重要.后端存储已经逐渐成为企业业务系统的核心和关键. 一般而言,我们有四 ...

  8. php中数组遍历的四种方式

    首先要讲一点的是:PHP中的数组与C/C++中的数组不同. 它是基于键值对结构的hash表来实现的(存在key/value的概念).有点类似于python和lua中的dictionary. 在没有显示 ...

  9. android xpath解析xml,Android 中处理 XML 的四种方式-DOM

    Android 中处理 XML 的几种方式连载中,我们就不介绍合成 XML 了,因为合成 XML 可以直接拼接字符串,虽然看起很不高大上,但却很有效.我们主要介绍如何取 XML 中的值. 适用 DOM ...

  10. IOS中Json解析的四种方法

    2019独角兽企业重金招聘Python工程师标准>>> 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此& ...

最新文章

  1. 如何构建一个好的电商搜索引擎?
  2. addHeaderView()异常 —— setAdapter has already been called
  3. Java中使用Jedis连接Redis数据库流程
  4. C++基础( C++初识、数据类型、运算符、程序流程结构、)
  5. 固体加热_干货分享| |固体氧化物燃料电池
  6. php路由类默认模块,微擎入口路由及其模块入口路由 - YangJunwei
  7. python的基础_python基础知识,python必背内容,一、python的基
  8. nyoj 78:圈水池 【凸包入门】
  9. 计算机对齐方式在哪里,word文档中默认的对齐方式是什么
  10. 拜登留学新政:美国读博直接拿绿卡,增加H1B签证限额!但未来留美门槛反而变高了?...
  11. 【Bioinfo Blog 012】【R Code 010】——生存分析(Kaplan-Meier Cox)
  12. iOS安全攻防(九)使用Theos开发SpringBoard的Tweat
  13. 一般人很难想象的一个营销方案,洗车店只用一招就让生意爆满
  14. 键盘突然失灵?VS调试时按F10F11F12都突然没反应?打数字0(ins)时出不来就像按鼠标右键一样?
  15. 解决Navicat 连接Oracle时报cannot create oci handles
  16. server sql 本月最后一天_SQL SERVER中求上月、本月和下月的第一天和最后一天 DATEADD DATEDIFF...
  17. 操作系统基础知识点(从题目中总结)期末复习总结 终极版 ctrl+f 寻找你想要的答案
  18. 【企业】华为灰度扩张史:洪流之中,平稳着陆
  19. 典范杜希奇与机器人_典范英语7_16 杜希奇与机器人
  20. 『蚂蚁呀嘿』的实现--PaddleGAN表情动作迁移-初体验

热门文章

  1. 黑鲨重装计算机安装无法继续,示例黑鲨装机大师装机失败无法开机怎么办?
  2. “钱三篇”后续之物价为什么上涨?
  3. 微信公众号如何排版好看?教你三招技巧
  4. 自己做网站需要掌握哪些知识?
  5. My97时间控件限制
  6. R2-React之ES6基础
  7. 如何免费搭建自己的个人网站
  8. Win11想运行老游戏怎么设置
  9. [汇编语言]立即数寻址和寄存器寻址
  10. Windows下把文件夹压缩成.tar.gz格式