MFMailComposeViewControllerDelegate 不工作 Swift 3
Posted
技术标签:
【中文标题】MFMailComposeViewControllerDelegate 不工作 Swift 3【英文标题】:MFMailComposeViewControllerDelegate not working Swift 3 【发布时间】:2016-10-04 22:10:05 【问题描述】:我已经在我的一些应用程序中使用邮件编写器有一段时间了,最近 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)
【问题讨论】:
【参考方案1】:这显然是一个 Xcode 错误。解决这个问题的唯一方法(在搜索 *** 一个小时后)是这样的:
@objc(mailComposeController:didFinishWithResult:error:)
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult,error: NSError?)
controller.dismiss(animated: true)
在方法实现之前查看@objc 宏。另请注意,最后一个参数必须是 NSError 类型,而不是 Apple 文档建议的 Error(并由 Xcode 自动完成)
【讨论】:
如果这真的是一个 XCode 错误,它仍然存在于 10.3 中,当您在后台线程上计算附件并使用另一个视图控制器进行进度时,它会在关闭时显示撰写控制器。但是这个答案仍然可以解决它,所以给它一个很大的支持!【参考方案2】:默认情况下,Swift 3 不再具有未命名的第一个参数(请参阅this proposal),因此您需要在函数中添加下划线:
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)
print(error)
controller.dismiss(animated: true, completion: nil)
【讨论】:
【参考方案3】: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】:在浪费了 2 个好小时后,我得出的结论是,从 Xcode 8.3 开始。 MFMailComposeViewController 不适用于混合的 swift/objc 代码库。它弹出奇怪的编译错误,首先我认为这是由于我的愚蠢,但不是。
这真是令人沮丧的苹果。我们大多数的老前辈在 obj-c 上确实有大量的代码,所以一个纯粹的 swift 场景几乎是不可能的。因此,当我将课程转移到 swift 时,我还必须应对额外的痛苦。
【讨论】:
【参考方案5】:添加
#import <MessageUI/MessageUI.h>
AppName-Bridging-Header.h
完成了这项工作!
【讨论】:
以上是关于MFMailComposeViewControllerDelegate 不工作 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章