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

模态展示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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:07:27