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

