我已经在我的一些应用程序中使用了邮件编写器一段时间了,而且最近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)
}
这显然是一个Xcode错误。解决这个问题的唯一方法(在搜索StackOverflow生命一小时后)是这样的:
@objc(mailComposeController:didFinishWithResult:error:)
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult,error: NSError?) {
controller.dismiss(animated: true)
}
请在方法实现之前查看@objc宏。另请注意,最后一个参数必须是NSError类型而不是Apple文档建议的错误(并由Xcode自动完成)
默认情况下,Swift 3不再具有未命名的第一个参数(请参阅this proposal),因此您需要在函数中添加下划线:
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
print(error)
controller.dismiss(animated: true, completion: nil)
}
在浪费了2个小时之后,我得出结论,从Xcode 8.3开始。 MFMailComposeViewController不适用于混合的swift / objc代码库。它出现了奇怪的编译错误,我认为首先是因为我的愚蠢,但没有。
这是令人沮丧的苹果。我们大多数老计时器确实有大量的obj-c代码,所以一个纯粹的快速方案几乎是不可能的。因此,当我快速移动课程时,我也必须处理额外的痛苦。
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
}
添加
#import <MessageUI/MessageUI.h>
到AppName-Bridging-Header.h
做了这个工作!