主题思想:如A、B、C、D 四个视图控制器 想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,再从 C pop 的A


解决方法如下:

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

[self.navigationController pushViewController: B :YES];  

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

此时已经到 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 =[NSMutableArray arrayWithArray:self.navigationController.viewControllers];  
[tempMarr insertObject:C atIndex:tempMarr.count- 2];  

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

[tempMarr removeObjectAtIndex:2];  

但是你会发现,这时的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 =[NSMutableArray arrayWithArray:self.navigationController.viewControllers];  
    [tempMarr insertObject:C atIndex:tempMarr.count- 2];  
    [tempMarr removeObject:self]; //此时 的self 就是指 B ,因为在 B 中呢  
    [self.navigationController setViewControllers:tempMarr animated:YES];  
}  

适用场景:

适合在如商品的详情页面上有商品的推荐,点击商品推荐仍是商品详情页面,如果不断push地话会很影响性能,该方法可以简单快捷的避免该问题。