模态展示UIViewController失败求助:重复跳转触发异常
这个问题很典型——你遇到的是模态视图控制器重复present时的自身调用错误,核心原因是第二次触发跳转时,调用present方法的对象变成了listVC本身,而不是原本的mainVC。下面给你一步步排查和解决的方法:
1. 检查present listVC的代码逻辑
大概率是你重复复用了同一个listVC实例,或者在代码中错误地让listVC去present自己。正确的做法是每次点击按钮时都创建新的listVC实例,并且由mainVC来执行present操作:
// 在mainVC的按钮点击方法里这么写 @objc func customButtonTapped() { // 每次都初始化新的listVC,不要复用旧实例 let listVC = ListVC() // 按需设置模态样式,比如.fullScreen或者.automatic listVC.modalPresentationStyle = .automatic // 一定要用mainVC(也就是self)来present,而不是其他对象 self.present(listVC, animated: true, completion: nil) }
2. 确认listVC的返回按钮逻辑没有问题
listVC里的返回按钮必须调用dismiss来关闭自己,绝对不能写任何present相关的代码:
// 在listVC的返回按钮点击方法里 @objc func backButtonTapped() { // 调用dismiss回到mainVC,不要做多余操作 self.dismiss(animated: true, completion: nil) }
3. 排查自定义按钮的事件绑定
你用到了自定义的CirButton,要确保这个按钮的点击事件是绑定到mainVC的方法上,而不是在某个流程中被错误地绑定到了listVC。比如检查按钮初始化或添加时的addTarget代码:
// 正确的绑定方式(在mainVC中) let cb = CirButton(...) cb.addTarget(self, action: #selector(customButtonTapped), for: .touchUpInside)
4. 断点调试定位根源
如果上面的方法还没解决,就在你调用present的代码处加断点,第二次点击按钮时查看self的类型——如果此时self是ListVC而不是mainVC,那你就要找清楚为什么点击事件的调用者变成了listVC,可能是按钮被意外添加到了listVC的视图层级里,或者target被篡改了。
内容的提问来源于stack exchange,提问作者user5359179
相关产品推荐
相关产品推荐

