MFMailComposeViewController 视图不会第二次关闭

Posted

技术标签:

【中文标题】MFMailComposeViewController 视图不会第二次关闭【英文标题】:MFMailComposeViewController view does not dismiss 2nd time 【发布时间】:2017-03-30 21:28:40 【问题描述】:

我认为这是一个独特的问题。我无法关闭我的电子邮件窗口。我正在使用 Xcode 8。

电子邮件在我第一次打开时会正确关闭,但如果我再次打开它就不会。如果我按“取消”,它不会给我“删除草稿”的选项。如果我按“发送”,则会发送电子邮件,但窗口不会关闭。

我的代码如下。 mailComposeController 第一次被正确调用,但它永远不会被第二次调用。有人对我缺少什么有任何想法吗?

let mail = MFMailComposeViewController()
func sendEmail(body: String, subject: String) 
    if MFMailComposeViewController.canSendMail() 
        mail.mailComposeDelegate = self

        mail.setSubject(subject)
        mail.setMessageBody("\(body)", ishtml: false)

        if let data = (body as NSString).data(using: String.Encoding.utf8.rawValue)
            //Attach File
            mail.addAttachmentData(data, mimeType: "text/plain", fileName: "data.txt")
        

        present(mail, animated: true)
     else 
        // show failure alert
    


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

【问题讨论】:

【参考方案1】:

您每次都需要创建一个新的MFMailComposeViewController。将您的 mail 声明移动到 sendEmail 中可以工作...

func sendEmail(body: String, subject: String) 
    if MFMailComposeViewController.canSendMail() 

       // Create a new MFMailComposeViewController…
       let mail = MFMailComposeViewController()

        mail.mailComposeDelegate = self

        mail.setSubject(subject)
        mail.setMessageBody("\(body)", isHTML: false)

        if let data = (body as NSString).data(using: String.Encoding.utf8.rawValue)
            //Attach File
            mail.addAttachmentData(data, mimeType: "text/plain", fileName: "data.txt")
        

        present(mail, animated: true)
     else 
        // show failure alert
    

至于为什么……?

【讨论】:

与原始问题无关,但您可以在使用 utf8 字符串时从字符串中获取数据,而无需解包。 mail.addAttachmentData(Data(body.utf8), mimeType: "text/plain", fileName: "data.txt") 感谢@LeoDabus 提出的代码改进建议。这也很有效。

以上是关于MFMailComposeViewController 视图不会第二次关闭的主要内容,如果未能解决你的问题,请参考以下文章