MFMailComposeViewControllerDelegate 不工作 Swift 3

Posted

技术标签:

【中文标题】MFMailComposeViewControllerDelegate 不工作 Swift 3【英文标题】:MFMailComposeViewControllerDelegate not working Swift 3 【发布时间】:2016-10-04 22:10:05 【问题描述】:

我已经在我的一些应用程序中使用邮件编写器有一段时间了,最​​近 mailComposeDelegate 不再被调用。我不确定这是否与 Swift 的新版本有关. 所以,我想我会问一下,看看是否有其他人有类似的问题。我可以介绍邮件编写器,但由于代表不工作,它永远不会被解雇。

以下是我一直在使用的代码的精确副本:

func launchFeedback() 
    guard MFMailComposeViewController.canSendMail() else 
        return
    

    let emailTitle = "Feedback"
    let messageBody = ""
    let toRecipents = ["johnappleseed@icloud.com"]
    mailComposer.mailComposeDelegate = self
    mailComposer.setSubject(emailTitle)
    mailComposer.setMessageBody(messageBody, ishtml: false)
    mailComposer.setToRecipients(toRecipents)
    self.show(mailComposer, sender: self)


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

【问题讨论】:

【参考方案1】:

这显然是一个 Xcode 错误。解决这个问题的唯一方法(在搜索 *** 一个小时后)是这样的:

    @objc(mailComposeController:didFinishWithResult:error:)
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult,error: NSError?) 
        controller.dismiss(animated: true)
    

在方法实现之前查看@objc 宏。另请注意,最后一个参数必须是 NSError 类型,而不是 Apple 文档建议的 Error(并由 Xcode 自动完成)

【讨论】:

如果这真的是一个 XCode 错误,它仍然存在于 10.3 中,当您在后台线程上计算附件并使用另一个视图控制器进行进度时,它会在关闭时显示撰写控制器。但是这个答案仍然可以解决它,所以给它一个很大的支持!【参考方案2】:

默认情况下,Swift 3 不再具有未命名的第一个参数(请参阅this proposal),因此您需要在函数中添加下划线:

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

【讨论】:

【参考方案3】:

Swift 4、Xcode 9.1。 我的问题是MFMailComposeViewController 工作正常,但是如果您单击取消、关闭,然后尝试再次打开它,取消和发送按钮都不会触发didFinishWith 委托功能。 之所以发生这种情况,是因为我已将 MFMailComposeViewController 声明为惰性变量,而解决方案是每次您想打开它时都创建 MFMailComposeViewController 的新实例。

问题:

lazy var mailComposeViewController: MFMailComposeViewController = 
    let mailComposeViewController = MFMailComposeViewController()
    mailComposeViewController.mailComposeDelegate = self
    mailComposeViewController.setToRecipients(["example@test.test"])
    mailComposeViewController.setSubject("subject")
    mailComposeViewController.setMessageBody("test body", isHTML: false)
    return mailComposeViewController
()

解决方案:

func createMailComposeViewController() -> MFMailComposeViewController 
    let mailComposeViewController = MFMailComposeViewController()
    mailComposeViewController.mailComposeDelegate = self
    mailComposeViewController.setToRecipients(["example@test.test"])
    mailComposeViewController.setSubject("subject")
    mailComposeViewController.setMessageBody("test body", isHTML: false)
    return mailComposeViewController

【讨论】:

这让我的大脑快要爆炸了。现在很明显,我知道了!非常感谢!【参考方案4】:

在浪费了 2 个好小时后,我得出的结论是,从 Xcode 8.3 开始。 MFMailComposeViewController 不适用于混合的 swift/objc 代码库。它弹出奇怪的编译错误,首先我认为这是由于我的愚蠢,但不是。

这真是令人沮丧的苹果。我们大多数的老前辈在 obj-c 上确实有大量的代码,所以一个纯粹的 swift 场景几乎是不可能的。因此,当我将课程转移到 swift 时,我还必须应对额外的痛苦。

【讨论】:

【参考方案5】:

添加

#import <MessageUI/MessageUI.h> 

AppName-Bridging-Header.h 完成了这项工作!

【讨论】:

以上是关于MFMailComposeViewControllerDelegate 不工作 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章