iOS开发:邮件弹窗关闭后如何显示发送状态提示框
解决邮件弹窗关闭后显示发送结果Alert的问题
我明白你的问题啦——你想在邮件发送/取消的弹窗关闭后,立刻弹出一个提示框告知结果,但现在的写法行不通,核心原因是你不能在邮件控制器还没被关闭的时候,直接用它来present新的Alert,系统会因为视图控制器栈的层级问题拒绝这个请求。
给你调整后的代码,关键是先关闭邮件控制器,在它的dismiss完成回调里再弹出结果提示:
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { // 先关闭邮件控制器,在完成回调里处理提示框 controller.dismiss(animated: true) { [weak self] in guard let self = self else { return } var alertTitle: String var alertMessage: String switch result { case .cancelled: alertTitle = "Cancelled" alertMessage = "Send Email has been cancelled" case .sent: alertTitle = "Sent" alertMessage = "Message Sent Successfully" case .failed: alertTitle = "Failed" alertMessage = error?.localizedDescription ?? "Failed to send email" case .saved: alertTitle = "Saved" alertMessage = "Email has been saved as draft" @unknown default: alertTitle = "Unknown" alertMessage = "Unknown result" } let alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "Ok", style: .default)) // 用当前的视图控制器来present提示框,这里用self或者邮件控制器的presentingViewController都可以 self.present(alertController, animated: true) } }
关键改动点:
- 先dismiss邮件控制器:把原来在Alert的handler里dismiss邮件控制器的逻辑,改成先dismiss邮件控制器,在它的completion回调里处理Alert的展示,确保视图栈状态正确。
- 覆盖所有result场景:补充了
.failed和.saved的情况,还加上了@unknown default来适配未来可能新增的枚举值,让代码更健壮。 - 弱引用self:避免循环引用,保证内存安全。
- 简化Alert逻辑:因为不需要再处理邮件控制器的dismiss了,所以Alert的Ok按钮可以不用写额外handler,系统会自动关闭Alert。
这样修改后,邮件弹窗关闭后就会立刻弹出对应的结果提示啦!
内容的提问来源于stack exchange,提问作者CVar
相关产品推荐
相关产品推荐

