MFMailComposeViewController 不发送电子邮件或关闭

Posted

技术标签:

【中文标题】MFMailComposeViewController 不发送电子邮件或关闭【英文标题】:MFMailComposeViewController does not send email or dismiss 【发布时间】:2019-11-06 23:15:27 【问题描述】:

我在视图控制器中使用MFMailComposeViewController,代码如下:

if !MFMailComposeViewController.canSendMail() 
    return

let mailComposeViewController = MFMailComposeViewController()
mailComposeViewController.mailComposeDelegate = self
present(mailComposeViewController, animated: true)

还有:

extension MyViewController : MFMailComposeViewControllerDelegate 
    private func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) 
        controller.dismiss(animated: true, completion: nil)
    

MFMailComposeViewController 按预期显示,但具有以下行为:

“取消”按钮不执行任何操作(如果消息尚未被编辑)或显示“删除草稿”/“保存草稿”操作表,其中没有一个选项会关闭 MFMailComposeViewController 无论是禁用(未设置收件人)还是启用(设置收件人),发送按钮都不执行任何操作 可以通过向下滑动视图来关闭视图(新的 ios 13 模态行为)

这是 Xcode 11.2、iOS 13.2、Swift 4。

我该如何解决这个问题?

【问题讨论】:

你确认委托方法被调用了吗? 【参考方案1】:

在这段代码中

extension MyViewController : MFMailComposeViewControllerDelegate 
    private func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) 
        controller.dismiss(animated: true, completion: nil)
    

删除关键字private。它对 Cocoa 隐藏了该方法,因此它永远不会被调用。

【讨论】:

是和不是。您希望这可以是私密的,这是对的!但它不可能。你不能通过说@objc private 来解决这个问题。很不幸。【参考方案2】:

确保您的 MyViewController 类不是 MFMailComposeViewController 的子类。

你应该:

    创建 UIViewController 子类(MailViewController 类:UIViewController) 添加 MFMailComposeViewController。 MailViewController:MFMailComposeViewControllerDelegate

或者:

直接从另一个 UIViewController 配置 MFMailComposeViewController()。例如:

let mailComposeVC = MFMailComposeViewController()
mailComposeVC.mailComposeDelegate = self
mailComposeVC.setToRecipients([recipient])
mailComposeVC.setSubject(subject)
mailComposeVC.setMessageBody(body, ishtml: false)
present(mailComposeVC, animated: true, completion: nil)

【讨论】:

以上是关于MFMailComposeViewController 不发送电子邮件或关闭的主要内容,如果未能解决你的问题,请参考以下文章