MFMailComposeViewControllerDelegate无法正常工作Swift 3

bev*_*omb 4 ios swift swift3 mfmailcomposeviewcontroller

我已经在我的一些应用程序中使用了一段时间的mail composer,最近,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)
}
Run Code Online (Sandbox Code Playgroud)

vid*_*ist 6

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

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

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


Dey*_*ton 3

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

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