iOS pop到指定视图报错

在 iOS 开发中主要使用 navigationController 和 present 进行视图跳转.

navigationController 使用堆栈管理要进行跳转的 controller, push 执行入栈操作; pop 执行出栈操作.

这些 controller 存放在 navigationController 的 viewControllers 数组中.

pop 方法有三种,

  1. popViewControllerAnimated:
    该方法的主要功能为:返回到上个界面
  2. popToRootViewControllerAnimated:
    该方法的主要功能为:返回到根视图
  3. popToViewController:animated:
    该方法的主要功能为:返回到指定视图

使用第三种方法要注意的是, 指定的视图要从 navigationController 的 viewControllers 数组中获取, 在 storyboard  创建的视图中, 即使用 storyboardID 获取指定的视图, 使用第三种方法还是会报错

let vc = storyboard?.instantiateViewController(withIdentifier: "ViewController")
navigationController?.popToViewController(vc!, animated: true)
//崩溃报错:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'

解决办法:

1. 如果知道在 viewControllers 数组中的下标, 可以直接从数组中获取

let base = UIApplication.shared.keyWindow?.rootViewController
if let nav = base as? UINavigationController {
    navigationController?.popToViewController(nav.viewControllers[0], animated: true)
}

2. 如果不知道, 可以通过遍历数组获取(其中 ViewController 是指定的 controller 类型)

let baseNav = UIApplication.shared.keyWindow?.rootViewController
if let nav = baseNav as? UINavigationController {
   for vc in nav.viewControllers {
       if let tempVC  = vc as? ViewController {
           navigationController?.popToViewController(tempVC, animated: true)
       }
   }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值