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

Swift中调用dismiss方法无法关闭Modal模态视图控制器问题求助

Swift Modal ViewController 调用dismiss无响应解决方案
  • 原因1:dismiss方法未在主线程调用
    UI相关操作必须运行在主队列,若你在异步回调(比如网络请求、数据库操作回调)中执行dismiss,会出现无响应的情况,修改代码如下:
DispatchQueue.main.async {
    confirmPopup.dismiss(animated: true, completion: nil)
}
  • 原因2:未使用正确的控制器执行dismiss操作
    遵循「谁present谁dismiss」的原则,你可以直接用弹出该Modal的主控制器执行dismiss,代码如下:
DispatchQueue.main.async {
    controller.dismiss(animated: true, completion: nil)
}

该写法会自动关闭当前控制器弹出的最上层Modal视图,无需绑定对应的弹出实例。

  • 原因3:重复弹出同一实例导致视图层级异常
    你当前的代码中confirmPopup是全局持有的单实例,每次调用showConfirmDialog都会复用同一个实例,若之前已弹出过该实例未正常关闭,再次present会出现层级异常,导致dismiss无效。建议将confirmPopup的实例化逻辑放到showConfirmDialog方法内部,每次弹出都创建新实例,修改后代码如下:
private func showConfirmDialog(byUser: String, category: String){
    let story = UIStoryboard(name: "OnlineChallenge", bundle: nil)
    let confirmPopup = story.instantiateViewController(withIdentifier: "waitingUser") as! ConfirmWaitUser
    confirmPopup.modalPresentationStyle = .overCurrentContext
    confirmPopup.modalTransitionStyle = .crossDissolve        
    controller.present(confirmPopup, animated: true, completion: nil)
}
  • 原因4:present时主控制器已不是当前顶层控制器
    若执行present操作时,你传入的controller上面已经弹出了其他视图,会导致confirmPopup未正常弹出,调用dismiss自然无响应。建议先获取当前应用最顶层的控制器,再执行present操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:45:04