不同的转场方式 A、B viewDidDisappear调用的流程不同

在A页面跳转到B页面的过程中 A 的 viewDidDisappear 方法和 B 的 viewDidAppear 谁先调用?

其实我以前一直理所当然的认为它们的顺序就是 A-viewDidDisappear --> B-viewDidAppear

今天写了个Demo去测试了一下,发现完全不是自己想象的那样,每一种转场(Push,Present,TabBar切换)都是不一样的。

测试


我自定义了两个类,继承自UIViewController,为了方便观察分别叫做A_ViewController,B_ViewController,然后重写了一系列 appeardisappear 方法。

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"A view will appear %@",self);
} - (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"A view did appear %@",self);
} - (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSLog(@"A view will disappear %@",self);
} - (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear: animated];
NSLog(@"A view did disappear %@",self);
}
然后分别用 push, present, 以及 tabbar 的切换来测试,然后查看打印的结果。

Push & Pop


--------------------------PUSH-----------------------------

 A  view will disappear <A_ViewController: 0x7fa11067a730>
B view will appear <B_ViewController: 0x7fa110516530>
A view did disappear <A_ViewController: 0x7fa11067a730>
B view did appear <B_ViewController: 0x7fa110516530> --------------------------POP----------------------------- B view will disappear <B_ViewController: 0x7fa110516530>
A view will appear <A_ViewController: 0x7fa11067a730>
B view did disappear <B_ViewController: 0x7fa110516530>
A view did appear <A_ViewController: 0x7fa11067a730>

在这里的调用顺序是和我之前预想的一样的,也就是

A-willDisappear --> B-willAppear --> A-didDisappear --> B-didAppear

Present & Dismiss


在模态的转场中就有一些不一样的事了。我们知道模态转场有好多种style,其中有两种我们需要特别注意的UIModalPresentationCustom,UIModalPresentationOverFullScreen。我们先看一下除了这两种style以外的转场,他们的调用顺序是怎样的。

-----------------------NormalPresent------------------------

 A  view will disappear <A_ViewController: 0x7fc2a14ac490>
B view will appear <B_ViewController: 0x7fc2a152a880>
B view did appear <B_ViewController: 0x7fc2a152a880>
A view did disappear <A_ViewController: 0x7fc2a14ac490> -------------------------DISMISS---------------------------- B view will disappear <B_ViewController: 0x7fc2a152a880>
A view will appear <A_ViewController: 0x7fc2a14ac490>
A view did appear <A_ViewController: 0x7fc2a14ac490>
B view did disappear <B_ViewController: 0x7fc2a152a880>

这里其实已经和push的转场不一样了。普通模态的转场的顺序是这样的

A-willDisappear --> B-willAppear --> B-didAppear --> A-didDisappear

再看看前面提到的那两种特殊的模态转场。因为在这两种方式的转场下A的view是不会消失的,所以所有与A有关的 appear 或 disappear 方法都不会被调用

-----------------------CustomPresent------------------------

 B  view will appear    <B_ViewController: 0x7f960249bac0>
B view did appear <B_ViewController: 0x7f960249bac0> -------------------------DISMISS---------------------------- B view will disappear <B_ViewController: 0x7f960249bac0>
B view did disappear <B_ViewController: 0x7f960249bac0>

所以在这两种style下只有B-willAppear --> B-didAppear

TabBar切换


TabBar 的切换也是一个很神奇的顺序

 B  view will appear    <B_ViewController: 0x7f88cbed7160>
A view will disappear <A_ViewController: 0x7f88cbed6680>
A view did disappear <A_ViewController: 0x7f88cbed6680>
B view did appear <B_ViewController: 0x7f88cbed7160>

与push不同的是,TabBar下,会先调用 B 的 willAppear,再调用 A 的 willDisappear

所以TabBar的顺序是这样的:

B-willAppear --> A-willDisappear --> A-didDisappear --> B-didAppear

总结


在每一种转场下,appear 与 disappear 都有一些不一样的顺序,一定要分清楚,不能一概而论。

Push: A-willDisappear-->B-willAppear-->A-didDisappear-->B-didAppear

Present: A-willDisappear-->B-willAppear-->B-didAppear-->A-didDisappear

CustomPresent: B-willAppear-->B-didAppear

TabBar: B-willAppear-->A-willDisappear-->A-didDisappear-->B-didAppear

iOS - 转场时 appear 与 disappear 的调用顺序探索的更多相关文章

  1. iOS 转场动画探究(一)

    什么是转场动画: 转场动画说的直接点就是你常见的界面跳转的时候看到的动画效果,我们比较常见的就是控制器之间的Push和Pop,还有Present和Dismiss的时候设置一下系统给我们的modalTr ...

  2. iOS 转场动画探究(二)

    这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一) 接着上一篇写的内容: 上一篇iOS 转场动画探究(一)我们说到了转场要素的第四点,把那个 ...

  3. iOS打包导出时出现Missing iOS Distribution signing

    iOS打包导出时出现Missing iOS Distribution signing 上传APP就出现Missing iOS Distribution signing indetity for 打包i ...

  4. 针对SharePointFarm场时安装部署OWA的步骤

    下面文章列出针对SharePointFarm场时安装部署OWA的步骤: http://blogs.technet.com/b/meamcs/archive/2013/03/27/office-web- ...

  5. 【原创】修复ios输入框获取焦点时不支持fixed的bug

    前些日子,做了一个手机站的项目,有一个页面是这样的, 有一个固定(position:fixed)的头部和底部导航,中间是一些表单内容,没啥特别的.但是到了ios中,正常滚动页面没有问题,一旦触发了文本 ...

  6. 取消input聚焦时的边框,去除ios点击时,自动添加的底色效果

    /*去除ios点击时,自动添加的底色效果*/ -webkit-tap-highlight-color: rgba(, , , ); /*去除焦点框*/ outline:none;

  7. [iOS]为什么不要在init初始化方法里调用self.view

    首先.如果你调用self.view的时候,就会调用view的getter方法, 这个时候,view是空的,那么系统就会自动给你创建一个view,然后就会触发ViewDidLoad方法.那么这个时候,如 ...

  8. [ios]IOS的AppDelegate方法中的事件触发调用 以及 关闭 ios应用程序

    IOS的AppDelegate方法中的事件触发调用 参考:http://blog.sina.com.cn/s/blog_a573f7990101bphp.html //当应用程序将要进入非活动状态执行 ...

  9. gcc/g++链接时.o文件及库的顺序问题

    折腾gcc/g++链接时.o文件及库的顺序问题 链接静态库的顺序问题 GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

随机推荐

  1. SAP Actual Costing with Material Ledger 激活实际成本后台配置

    Actual Costing with Material Ledger 1      Purpose This configuration guide provides the information ...

  2. linux下压缩与打包工具——gzip, bzip2 和 tar;

    以下内容来自:阿铭http://www.apelearn.com/study_v2/chapter11.html, 把常用的写出来了:感觉可以了: 只管压缩与解压缩的工具: gzip 工具: 用的时候 ...

  3. Unity入门教程(下)

    一.概要 在 Unity入门教程(上) 中我们创建了一个游戏项目,并且创建了玩家角色和小球这些游戏对象,还通过添加游戏脚本实现了小方块的弹跳.虽然功能比较简单,但是完整地表现了使用Unity开发游戏的 ...

  4. 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

    第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...

  5. 性能优化系列四:Tomcat优化

    一.Tomcat工作原理 1. TCP的三次握手四次挥手 三次握手: 说明: 类比于A和B打电话: A对B说:你好,我是A,你能听到我说话吗? B对A说:嗯,我能听到你说话 A对B说:好,那我们开始聊 ...

  6. 8款最新CSS3表单 环形表单很酷

    当我们在网站上注册登录还是提交评论,都需要用到表单,今天我们来分享8款最新CSS3表单,有几个效果很酷很特别,有些也非常实用,一起来看看. 1.CSS3环形特色表单 转圈切换表单焦点 这款CSS3表单 ...

  7. nginx-windows版

    nginx  windows版,添加 分别是: 重启.启动.停止 下载地址:https://files.cnblogs.com/files/007sx/nginx-windows.zip

  8. Android从文件读取图像显示的效率问题

    因为从文件读取图像到Bitmap是一件比较费时的事情,所以研究了一下几种可行的办法,并做了对比. 首先解释一下为什么耗时,这是因为,在从jpg或者png文件中读取Bitmap时,一来需要对外存进行操作 ...

  9. Thinkphp5 iis环境下安装报错400 500

    要求一:服务器需要开启伪静态功能 要求二:新建文件夹web.config 放到入口目录下(如public/web.config  或者/web.config),内容如: <?xml versio ...

  10. node配置自动监测文件改变不重启

    方法一: nodemon npm install -g nodemon nodemon ./bin/www 或者在npm start命令里把node改为nodemon 方法二:supervisor n ...