MFMailComposeViewControllerDelegate无法正常工作Swift 3

问题描述 投票:3回答:5

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

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

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

    let emailTitle = "Feedback"
    let messageBody = ""
    let toRecipents = ["[email protected]"]
    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)
}
ios swift swift3 mfmailcomposeviewcontroller
5个回答
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
投票

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

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

1
投票

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

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


1
投票

Swift 4,Xcode 9.1。我的问题是MFMailComposeViewController工作正常,但如果你点击取消,解雇,然后再次尝试打开它取消和发送按钮将不会激活didFinishWith委托功能。它发生了,因为我已经宣布MFMailComposeViewController为懒惰变量,解决方案是每次要打开它时创建MFMailComposeViewController的新实例。

问题:

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

解:

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

0
投票

添加

#import <MessageUI/MessageUI.h> 

AppName-Bridging-Header.h做了这个工作!

© www.soinside.com 2019 - 2024. All rights reserved.