You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Segue致App崩溃:不建议在已分离视图控制器上呈现控制器

解决自定义Segue触发时的“Presenting on detached view controllers”崩溃问题

嘿,我太懂这种“昨天还好好的,今天改完代码直接炸锅”的挫败感了!而且StackOverflow上的常规方案对你的场景不适用,确实得从你自定义Segue的修改点入手排查。

这个报错的核心逻辑其实很明确:你试图用一个已经脱离了视图控制器层级的VC来present新页面——结合“今日修改App后才出现”这个前提,大概率是你今天的改动不小心影响了自定义Segue依赖的VC层级状态,给你几个针对性的排查方向:

  • 检查自定义Segue的perform()方法:你用来作为present发起者的sourceViewController,是不是在触发Segue前已经被移除了?比如你今天有没有调整过页面跳转逻辑,提前对这个VC做了popViewController、dismiss或者removeFromParent()操作?
  • 验证源VC的视图层级状态:在Segue的perform()方法开头加一行调试代码:
    print("Source VC window: \(sourceViewController.view.window), Parent VC: \(sourceViewController.parent)")
    
    如果输出里window是nil或者parent是nil,说明这个VC已经不在活跃的视图层级里了,自然不能用来present新页面。
  • 排查Segue的触发时机:你今天有没有把Segue的触发逻辑放到了异步回调里?比如网络请求完成后触发Segue?这时候原来的源VC可能已经被用户操作关闭或者系统释放了,最好确保触发Segue时,源VC是当前屏幕上的活跃VC。
  • 检查自定义Segue的实例引用:有没有可能你今天修改代码时,不小心让Segue里用到的VC实例变成了“游离状态”?比如手动持有了一个VC的引用,但没有把它正确加入到导航栈或者父VC的层级中?

如果还是找不到问题,建议在崩溃的断点处,查看sourceViewController的navigationController、presentedViewController这些属性的详细状态,应该能找到它脱离层级的原因。

内容的提问来源于stack exchange,提问作者thelearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:08:19