MFMailComposeViewControllerDelegate无法正常工作Swift 3

时间:2016-10-04 22:10:05

标签: ios swift swift3 mfmailcomposeviewcontroller

我已经在我的一些应用程序中使用了邮件编辑器一段时间了,而且最近mailComposeDelegate不再接到电话。
我不确定这是否与新发布的版本有关。斯威夫特。
所以,我想我会问,看看是否有其他人有类似的问题。
我可以介绍邮件作曲家,但由于代表不工作,它永远不会被解雇。

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

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)
}

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

这是令人沮丧的苹果。我们大多数老计时器确实有大量的obj-c代码,所以一个纯粹的快速方案几乎是不可能的。因此,当我快速移动课程时,我也必须处理额外的痛苦。

答案 3 :(得分:1)

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 :(得分:0)

添加

#import <MessageUI/MessageUI.h> 

AppName-Bridging-Header.h做完了!