自定义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
相关产品推荐
相关产品推荐

