You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让iOS邮件发送应用弹出"邮件已发送/已取消"提示?

解决iOS邮件发送状态的弹窗提示问题

嗨,我明白你想要实现的效果——在邮件控制器关闭后,给用户一个清晰的弹窗提示,告诉他们邮件是成功发送、取消还是发送失败对吧?咱们来一步步把这个功能弄好,顺便解决你之前代码里的警告问题。

首先,咱们先分析你注释掉的代码里可能导致警告/错误的点:

  • result.rawValue判断枚举值没必要,直接匹配MFMailComposeResult的case更简洁安全
  • 错误处理里的error!.localizedDescription是强制解包,如果error为nil会崩溃,得用可选绑定做安全处理
  • 原来的print语句用了C风格的%@格式符,Swift里直接用字符串插值就好,混用会导致语法警告

接下来是修改后的完整代码,我把弹窗逻辑完美整合到代理方法里了:

@IBAction func Senden(_ sender: Any) {
    let toRecipients = ["Mail@adress.com"]
    let mc: MFMailComposeViewController = MFMailComposeViewController()
    mc.mailComposeDelegate = self
    mc.setToRecipients(toRecipients)
    mc.setSubject(FirmaFeld.text!)
    mc.setMessageBody("Firma: \(FirmaFeld.text!) \n\n Kontaktperson: \(KontaktpersonFeld.text!) \n\n EMail: \(EMailFeld.text!) \n\n Anliegen: \(NachrichtFeld.text!)", isHTML: false)
    self.present(mc, animated: true, completion: nil)
}

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    // 先关闭邮件控制器,在关闭完成后弹出提示弹窗,保证体验流畅
    controller.dismiss(animated: true) { [weak self] in
        guard let self = self else { return }
        
        var alertTitle = ""
        var alertMessage = ""
        
        switch result {
        case .cancelled:
            alertTitle = "邮件已取消"
            alertMessage = "你取消了邮件发送"
        case .saved:
            alertTitle = "邮件已保存"
            alertMessage = "邮件已保存到草稿箱"
        case .sent:
            alertTitle = "邮件已发送"
            alertMessage = "邮件成功发送"
        case .failed:
            alertTitle = "发送失败"
            // 安全处理错误信息,避免强制解包导致崩溃
            alertMessage = error?.localizedDescription ?? "未知错误导致发送失败"
        @unknown default:
            // 处理未来可能新增的枚举值,避免编译警告
            alertTitle = "状态未知"
            alertMessage = "无法识别邮件操作状态"
        }
        
        // 创建并弹出提示弹窗
        let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        self.present(alert, animated: true)
    }
}

@IBAction func dismissKeyboard(_ sender: Any) {
    self.resignFirstResponder()
}

我来给你解释几个关键的优化点:

  • [weak self]避免循环引用,闭包持有self引用时加上weak更安全,防止内存泄漏
  • 直接匹配MFMailComposeResult的case,代码更易读,也避免了类型转换错误
  • 错误处理用了可选链和空合运算符,安全处理error的可选值,不会因为error为nil崩溃
  • 添加了@unknown default分支,这是Swift 5+的语法,用来处理未来苹果可能新增的枚举值,避免出现编译警告
  • 把弹窗放在dismiss的completion闭包里,确保邮件控制器完全关闭后再显示弹窗,用户体验更流畅

这样修改后,你的应用就能在邮件操作完成后,给用户清晰的弹窗提示啦~

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

火山引擎 最新活动