OS 如何随意的穿插跳跃,push来pop去

主题思想:如A、B、C、D 四个视图控制器

想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop 的A


解决方法如下:

1.假如此时在 A 控制器下,想要到 push 到 B, 可以这样写

[self.navigationController pushViewController: B :YES];

这时 self.navigationController.viewControllers 中按顺序含有 [A,B]

2.此时已经到 B 控制器下了, 接下来是 push 到 D, 可以这样写

[self.navigationController pushViewController: D :YES];

这时 self.navigationController.viewControllers 中按顺序含有 [A,B,D]

接下来很重要,很重要,很重要

如何想从 D pop 到 C, 看数组[A,B,D] 中压根就没有C 该如何pop 到C呢?

这时就需要对这个数组进行修改,将C 加入进去

于是 你会如下写:

[self.navigationController.viewControllers addObject:C];

发现报错,这是因为self.navigationController.viewControllers 是不可变数组,没办法了,我们只好转换一下了:

NSMutableArray*tempMarr =[NSMutableArrayarrayWithArray:self.navigationController.viewControllers];

此时再加入C 就容易多了,咦,聪明的你会发现从 D pop C 不能直接将 C直接 addObject;

当然,我会这样做:

[tempMarr insertObject:C atIndex:tempMarr.count- 2];

这时候 tempMarr 是这样的 [A,B,C,D], 可是 要想 从 C pop 到 A ,数组中就不能有 B

就需要 将tempMarr 变成 [A,C,D] ,至于怎么变,你比我懂得多,

懂得思考的同学会发现 这时的self.navigationController.viewControllers 依然是 [A,B,D], 不用急,不用怕navigationController 有这样一个方法, 可以搞定,如下:

[self.navigationController setViewControllers:tempMarr animated:YES];

有的同学会说,这不是直接把 B 替换 成 C 吗

看上去是这样,可是跳转的时机,时机,时机重要的事情说三遍,还有视图的切换,切换,切换

此时还在 B 控制器中,这些处理过程都是在 B 中处理的 , 也必须是 B 执行了 push 到 D 方法后,也就是说

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

之后 进行的 数组处理;

附加代码:

在B 控制器中处理:

-(void)pushTest {

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

    NSMutableArray*tempMarr =[NSMutableArrayarrayWithArray:self.navigationController.viewControllers];

    [tempMarr insertObject:C atIndex:tempMarr.count- 2];

    [tempMarr removeObject:self]; //此时 的self 就是指 B ,因为在 B 中呢

    [self.navigationController setViewControllers:tempMarr animated:YES];

}

Demo下载地址

iOS 如何随意的穿插跳跃,push来pop去的更多相关文章

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

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

  2. iOS 中push和pop到底系统做了些什么事

    iOS中的push和pop是一个很常用的视图切换方法,他们是成对出现的, 简而言之,push就是压栈,pop就是出栈! [self.navigationController pushViewContr ...

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

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

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

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

  5. 自定义UINavigationController push和pop动画

    http://segmentfault.com/q/1010000000143983 默认的UINavigationController push和pop的默认动画都是左右滑动推出,我的应用要求这种界 ...

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

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

  7. 设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)

    面试的时候,面试官让设计一个栈,要求有Push.Pop和获取最大最小值的操作,并且所有的操作都能够在O(1)的时间复杂度完成. 当时真没啥思路,后来在网上查了一下,恍然大悟,只能恨自己见识短浅.思路不 ...

  8. 【编程题目】栈的 push、pop 序列

    29.栈的 push.pop 序列(栈)题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整 ...

  9. 24.栈的push和pop序列[StackPushPopSequence]

    [题目] 输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2 ...

随机推荐

  1. 原生javascript-图片按钮切换

    原生javascript-图片按钮切换 即上次被分配写原生JS相册弹窗后,这次又接到了写原生JS,图片按钮切换,真激情: 个人在线实例:http://www.lgyweb.com/picSwitch/ ...

  2. hdu 1728 搜索求最少的转向次数

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. Data Guard组件等相关介绍

    1.Data Guard组件介绍  Data Guard架构归类为3个主要的组件. Data Guard 重做传输服务  重做传输服务用来将主数据库生成的重做数据传输给备用数据库. Data Guar ...

  4. magnum devstack部署

    magnum安装 安装条件: 至少要10G以上内存的机器.亲测使用6G的虚拟机,所有操作均有至少一秒延迟. 硬盘至少50G 良好的上网环境 操作步骤参见快速入门 以下是我操作的步骤记录 sudo mk ...

  5. JVM执行引擎的执行过程

    摘自深入分析java web技术内幕

  6. .Net程序员学用Oracle系列(1):导航目录

    本人从事基于 Oracle 的 .Net 企业级开发近三年,在此之前学习和使用的都是 (MS)SQL Server.未曾系统的了解过 Oracle,所以长时间感到各种不习惯.不方便.怪异和不解,常会遇 ...

  7. C语言之总结3

    23). 内存中的五大区域 a. 栈 是专门用来存储局部变量的.所有的局部变量都是声明在栈区域中的. b. 堆 允许程序员手动的从堆申请空间来使用.(对象) c. BSS段 是用来存储未初始化的全局变 ...

  8. 动态SQL语句:定义(一)

    文章系列 动态SQL语句:定义(一) 静态SQL与动态SQL 静态SQL:程序运行前,具有固定的形式和结构的SQL. 动态SQL:程序运行时,能够动态改变形式或结构的SQL. 一些思考和想法 在实际的 ...

  9. ruby将mysql查询到的数据保存到excel

    require "win32ole" require 'pathname' require 'mysql2' excel = WIN32OLE.new('excel.applica ...

  10. kubernetes1.4 基础篇:Learn Kubernetes 1.4 by 6 steps

    本教程受Kubernetes官方最新更新的文档所触发,之所以没有做单纯的翻译是因为如下几个原因: Kubernetes官方此教程基于minikube,个人对minikube可能有偏见,觉得像玩具. M ...