我已经在我的一些应用程序中使用了邮件编辑器一段时间了,而且最近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)
}
答案 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
做完了!