iOS如何随意的穿插跳跃,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- ];

这时候 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- ]; [tempMarr removeObject:self]; //此时 的self 就是指 B ,因为在 B 中呢 [self.navigationController setViewControllers:tempMarr animated:YES]; }

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

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

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

  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. 在ubuntu下配置android开发环境

    http://developer.android.com/sdk/installing/index.html 基本上上面官网的链接可以解决所有问题,但是具体在安装过程中还是有一些坑. 说说具体流程 1 ...

  2. 如何利用WordPress创建自定义注册表单插件

    来源:http://www.ido321.com/1031.html 原文:Creating a Custom WordPress Registration Form Plugin 译文:创建一个定制 ...

  3. nodejs学习笔记之mongoDB

    这两天在学习nodejs,但是发现那本书nodejs入门指南上所用的好多方法都报错. 这里主要说下数据库部分 关于注册部分:书上创建数据库那里可能要小心点,用户名不存在的时候,下面调用save的对象要 ...

  4. sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20757 [题意] 求有容量上下界的无源无汇可行流. [思路] ...

  5. bzoj 1391 [Ceoi2008]order(最小割)

    [题意] 有n个有偿工作选做,m个机器,完成一个工作需要若干个工序,完成每个工序需要一个机器,对于一个机器,在不同的工序有不同的租费,但买下来的费用只有一个.问最大获益. [思路] 对于工作和机器建点 ...

  6. 暴雪hash算法

    你有一个非常大的字符串数组A,现在又有一个字符串B,需要你去检测B是否存在于A中.最简单粗暴的方法是遍历整个A,但是这个方法投入到实际应用时的运行速度是难以接受的.在没有与其他所有字符串比较前怎么知道 ...

  7. Spark系列(九)DAGScheduler工作原理

    以wordcount为示例进行深入分析 1  33  ) { 46        logInfo("Submitting " + tasks.size + " missi ...

  8. homework 08_2 C++11新特性作业之二

    ---恢复内容开始--- 1.使用Lambda表达式计算“hello world!”中字母e和i的数量 下面是代码: #include "stdafx.h" #include< ...

  9. work_7

    1. 理解C++变量的作用域和生命周期 a) 用少于10行代码演示你对局部变量的生命周期的理解 局部变量分为动态局部变量和静态局部变量,其共同点为作用域均为定义它的函数体或语句块,其不同点为其生命周期 ...

  10. 在MVC项目中使用RDLC报表

    原文地址:http://www.cnblogs.com/wuhuacong/p/4109833.html RDLC是一个不错的报表,有着比较不错的设计模式和展现效果,在我的Winform开发里面,使用 ...