iOS中的push和pop是一个很常用的视图切换方法,他们是成对出现的,

简而言之,push就是压栈,pop就是出栈!

[self.navigationController pushViewController:VC animated:YES];

那么苹果为实现这一句话具体做了些什么事呢?

[self addChildViewController:VC];                                   // 1
VC.view.frame = [self frameForContentController]; // 2
[self.view addSubview:VC.view]; // 3
[VC didMoveToParentViewController:self]; // 4
  • 第一步,NavigationController用addChildViewController这个函数把VC这个controller添加作为自己的子视图控制器。
  • 第二步,设置VC这个controller里的根view的frame。
  • 第三步,把VC.view添加到Navigationcontroller.view上。
  • 第四步,用didMoveToParentViewController这个方法通知已经push完毕。

既然有push,那么就会有pop

[self.navigationController popViewControllerAnimated:YES];

苹果做的事:

[VC willMoveToParentViewController:nil];    // 1
[VC.view removeFromSuperview];    // 2
[VC removeFromParentViewController]; // 3
  • 第一步,用willMoveToParentViewController这个方法,并把参数设置为nil,通知VC这个Controller即将被移除父视图控制器。
  • 第二步,把VC.view移除出父视图控制器的view。
  • 第三步,然后用removeFromParentViewcontroller这个方法把VC彻底移除。

下面贴出RESideMenu的源码里面它做的处理(其实是一个道理)

上面原理部分参考的是彦祖的一篇博客的一部分内容

iOS 中push和pop到底系统做了些什么事的更多相关文章

  1. js中push和pop的用法

    push: 将新元素追加到一个数组中,并返回新的数组长度: 语法:arrayObj.push([item1 [item2 [. . . [itemN ]]]]) var number; var my_ ...

  2. iOS中push视图的时候,屏幕中间会出现一条灰色的粗线的解决方案

    因为执行动画需要时间,所以在动画未完成又执行另一个切换动画,容易产生异常.所以在一个方法连续push不同的VC是没有问题的,但是不小心push同一个VC,并且animated为YES,可能多次跳转了 ...

  3. linux中,当执行rpm -e删除一个软件包时,都做了些什么事

    问题描述: 今天在通过rpm进行删除软件包时,出现了问题,就引发了我对于rpm包执行删除动作时的一些行为做了思考,之前找了很多的文章,后来想如果有debug日志信息,那么不就都清楚了吗 通过打印rpm ...

  4. iOS开发-21UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解

    (1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...

  5. 【iOS开发-21】UINavigationController导航控制器初始化,导航控制器栈的push和pop跳转理解

    (1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最以下,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...

  6. UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解

    (1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...

  7. iOS如何随意的穿插跳跃,push来pop去

    iOS如何随意的穿插跳跃,push来pop去? 主题思想:如A.B.C.D 四个视图控制器. 想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop ...

  8. iOS 中的Push Notifications简单实现(APNS)

    Android中的通知只有一种,就是Local Notifications,而iOS中除了Local Notifications外,还有一种Push Notifications.ios的这2种noti ...

  9. IOS中调用系统的电话、短信、邮件、浏览功能

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...

随机推荐

  1. array类型的方法

    var arr1 = [12,454,'dafda','feagfag',23]; var arr2 = [46468,'ffwfe','dafs','dfsfs']; arr1.indexOf('d ...

  2. ffmpeg文件生成m3u8文件及ts切片程序(一)

    ffmpeg文件生成m3u8文件及ts切片程序(一) 实现目标:输入本地文件,实现m3u8切片,功能点请看注释,注意:注释很重要. 参考: http://www.cnblogs.com/mystory ...

  3. 如何自动更新SVN项目

    在桌面新建“SVN Update.bat”文件,把下面的命令复制到该文件中,保存并退出,然后使用windows的“任务计划”功能,就可以实现定时自动更新SVN目录. 按此批处理文件的方法执行,一次可自 ...

  4. 【ACM】括号配对问题 - 栈

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  5. 备份当前的ubuntu系统生成iso

    使用respin,步骤如下: sudo add-apt-repository ppa:sergiomejia666/respin sudo apt-get update sudo apt-get in ...

  6. stdafx.h预编译头

    转自http://blog.csdn.net/qingkong8832/article/details/6695123 stdafx.h 1名称的英文全称为:Standard Application  ...

  7. SOA框架

    SOA是什么 估计很多人都听说过SOA这个词了,但是很多人还是不知道到底什么是SOA.开发人员很容易理解为是一个Web Service,但是这绝对不是SOA,那顶多只能算是SOA的一种实现方法.那么, ...

  8. CentOS yum安装mcrypt

    CentOS yum安装mcrypt   本篇排错的前提是只想用yum安装,不想使用源码包编译安装. php依赖一下包:   #yum install libmcrypt libmcrypt-deve ...

  9. java向上取整向下取整

    向上取整用Math.ceil(double a) 向下取整用Math.floor(double a) 举例: public static void main(String[] args) throws ...

  10. 可视化工具Navicat的使用/pymysql模块的使用

    一.可视化工具Navicat的使用 1.官网下载:http://www.navicat.com/en/products/navicat-for-mysql 2.网盘下载:http://pan.baid ...