iOS pop到指定视图报错

导航栏在 iOS 开发中,是使用最多的视图跳转基础。

导航栏跳转主要方法为 push和 pop。

在内存中,以栈的方式管理视图,每push一个都会将目标视图压入视图栈,成为栈顶元素。而 pop 则相反,具体释放下文会提到。

因此,在跳转的过程中,不能一味的 push,特别是返回到主界面、上一个界面等操作;内存会不断积压,导致内存泄露等问题。

pop 方法有三种,

  1. popViewControllerAnimated:
    该方法的主要功能为:返回到上个界面
  2. popToRootViewControllerAnimated:
    该方法的主要功能为:返回到根视图
  3. 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];
    }
}

希望这篇文章能帮助你解决问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。