使用presentingViewController循环返回:5次跳转后回首屏代码可行吗?
这段代码能实现5次页面跳转后返回首个页面吗?
嘿,咱们来好好拆解一下这段代码的问题——它既过不了编译,逻辑上也没法保证帮你回到首个页面,具体原因和正确的实现方式如下:
首先,代码存在语法错误
先看你给出的代码:
var now_Page: Int = 5 /// now 5 pages for i in now_Page{ self.dismiss(animated: true, completion: nil) /// back 5 pages }
Swift的for-in循环要求遍历的是一个序列类型(比如数组、范围0..<5这类),而now_Page是单个Int值,直接写for i in now_Page会触发编译错误:Type 'Int' does not conform to protocol 'Sequence',连运行的机会都没有。
就算修正语法,逻辑也有问题
假设咱们把循环改成正确的写法(比如for _ in 0..<now_Page),这段代码依然没法可靠地回到首个页面,核心原因是dismiss的行为和你页面的跳转方式强相关:
- 如果你的页面是通过
present方式打开的模态页面:
每次dismiss确实会回到上一个presenting页面,但如果你的模态栈层级不是恰好5层,或者中间有页面是嵌套present的复杂情况,5次dismiss可能要么提前结束(层级不足),要么跳过目标页面。而且这种循环调用的方式效率很低,不如直接一次性dismiss到根。 - 如果你的页面是通过
UINavigationController的push方式加入导航栈的:dismiss完全不起作用!导航栈的返回需要用pop系列方法,dismiss是专门针对模态页面的API,调用它不会对导航栈有任何影响。
正确的实现方式
根据你的页面跳转类型,选择对应的方法:
情况1:使用导航栈(UINavigationController)
如果是push跳转的页面,直接一行代码就能回到根页面:
// 直接回到导航栈的首个页面 navigationController?.popToRootViewController(animated: true)
如果你确实需要精确返回5次(而不是直接回根),可以通过导航栈的viewControllers数组定位目标页面:
if let navVC = navigationController, navVC.viewControllers.count > 5 { // 计算目标页面在栈中的索引(假设当前是第5个跳转后的页面) let targetIndex = navVC.viewControllers.count - 5 - 1 let targetVC = navVC.viewControllers[targetIndex] navVC.popToViewController(targetVC, animated: true) }
情况2:使用模态跳转(present)
如果是模态打开的页面,推荐递归找到最底层的presenting页面,一次性dismiss:
func dismissToRoot() { if let presentingVC = presentingViewController { presentingVC.dismissToRoot() } else { dismiss(animated: true) } } // 调用这个方法就能回到最开始的页面 dismissToRoot()
如果确定模态栈恰好是5层,也可以修正循环后调用,但上面的递归方法更通用可靠。
内容的提问来源于stack exchange,提问作者WaFuNuke
相关产品推荐
相关产品推荐

