最近要实现一个 连续 pop 两次 又 Push 一个新的 MVC 的需求,所以把经历写出来分享一下。
NavgationController 是 iOS 中最常用的控制器了,先看官网文档:
The
UINavigationController
class implements a specialized view controller that manages the navigation of hierarchical content. This navigation interface makes it possible to present your data efficiently and makes it easier for the user to navigate that content. You generally use this class as-is but in iOS 6 and later you may subclass to customize the class behavior.The screens presented by a navigation interface typically mimic the hierarchical organization of your data. At each level of the hierarchy, you provide an appropriate screen (managed by a custom view controller) to display the content at that level.
大概意思就是说 导航控制器是专门用作管理你 App 视图控制器层次的专有控制器。
先看一下 几个关于导航控制器的方法:
初始化方法:
initWithRootViewController: AViewontroller
创建一个导航控制器,并且将AViewController 作为导航控制器的根控制器,前面说过,导航控制器只负责管理用户控制器,而且是以栈的方式
管理方法:
– pushViewController: animated:
– popViewController: Animated:
– popToRootViewController: Animated:
– popToViewController:animated:
push ,即向栈内 push 新的 ViewController,新的 ViewController 成为了 栈顶的控制器
pop,即从栈内推出栈顶的控制器,(App 中后退 back 就是如此)。
比如我要在当前控制器中 push 或者 pop 一个 ViewController,一般都是这样子调用:
[self.navigationController 方法];
如果只是调用一次,或者 push 多次都不会有问题,但是 pop 就会有问题,因为 第一次 pop 后,当前的控制器已经出栈了,下面所有语句中的 self 都等于 nil,在 OC 中,对 nil 发送方法,肯定是无效的,所以连续 pop 的时候 需要将导航控制器保存下来,例如 id nav = self.navigationController
经过测试,保存后,可以多次pop push,另外要注意,除了最终要显示的 ViewController 以外,其他的 pop push 操作都要设置动画为 NO,不然会导致 navigationBar 的错误。