导航栏在 iOS 开发中,是使用最多的视图跳转基础。
导航栏跳转主要方法为 push和 pop。
在内存中,以栈的方式管理视图,每push一个都会将目标视图压入视图栈,成为栈顶元素。而 pop 则相反,具体释放下文会提到。
因此,在跳转的过程中,不能一味的 push,特别是返回到主界面、上一个界面等操作;内存会不断积压,导致内存泄露等问题。
pop 方法有三种,
- popViewControllerAnimated:
该方法的主要功能为:返回到上个界面 - popToRootViewControllerAnimated:
该方法的主要功能为:返回到根视图 - popToViewController:animated:
该方法的主要功能为:返回到指定视图
pop对盏的释放方式为,不断地将目标视图与当前视图之间的视图做出栈操作,即被释放。直到目标视图成为栈顶元素。
其中本文针对的主要报错为第三种方法
如果第一次使用 popToViewController:animated:
通常会使用如下代码
AViewController *A = [[AViewController alloc] init];
[self.navigationController popToViewController:A animated:YES];
但是直接奔溃报错,错误如下
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'
//新增
原因很简单,上述所创建的实例对象并不是导航栏栈里面的实例对象。如果某个变量直接是导航栏栈中的实例变量即可直接使用
既然不能直接使用,如何使用呢?
如果没有变量指向想要 pop 的视图实例,如何解决呢?
原理:遍历视图栈的所有元素,找到目标视图,将目标视图创建新对象, 再使用popToViewController:animated:
for (UIViewController *vc in self.navigationController.childViewControllers) {
if ([vc isKindOfClass:[AViewController class]]) {
AViewController *mainVC = (AViewController *)vc;
[self.navigationController popToViewController:mainVC animated:YES];
}
}
希望这篇文章能帮助你解决问题。