在 iOS 开发中主要使用 navigationController 和 present 进行视图跳转.
navigationController 使用堆栈管理要进行跳转的 controller, push 执行入栈操作; pop 执行出栈操作.
这些 controller 存放在 navigationController 的 viewControllers 数组中.
pop 方法有三种,
- popViewControllerAnimated:
该方法的主要功能为:返回到上个界面 - popToRootViewControllerAnimated:
该方法的主要功能为:返回到根视图 - 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)
}
}
}