【问题标题】:MFMailComposeViewControllerDelegate not working Swift 3MFMailComposeViewControllerDelegate 不工作 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)
}

【问题讨论】:

    标签: ios swift swift3 mfmailcomposeviewcontroller


    【解决方案1】:

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

        @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 完成了这项工作!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-08
          • 1970-01-01
          • 2018-03-31
          相关资源
          最近更新 更多