【问题标题】:MFMailComposeViewController not sending email or invoking delegate (MFMailComposeViewControllerDelegate)MFMailComposeViewController 不发送电子邮件或调用委托 (MFMailComposeViewControllerDelegate)
【发布时间】:2018-06-01 18:46:24
【问题描述】:

我有一个 MFMailComposeViewController 设置并显示如下:

class MyViewController: UIViewController {

    // MARK: - Properties
    let composeViewController = MFMailComposeViewController()

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {
        composeViewController.mailComposeDelegate = self
        composeViewController.setToRecipients([Constants.contactRecipientEmail])
        composeViewController.setSubject(Constants.contactSubject)
        composeViewController.setMessageBody(Constans.body, isHTML: false)
        present(composeViewController, animated: true, completion: nil)
    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
    private func mailComposeController(_ controller: MFMailComposeViewController,
                                       didFinishWith result: MFMailComposeResult,
                                       error: Error?) {
        switch result {
        case .sent:
            print("Email sent")
        case .saved:
            print("Draft saved")
        case .cancelled:
            print("Email cancelled")
        case  .failed:
            print("Email failed")
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

我遇到了这个问题:

  1. 按 Compose 上的“发送”后,不会调用 MFMailComposeViewControllerDelegate。

我可能缺少什么?

我无法将 mailComposeController 声明为公开:

【问题讨论】:

  • 可能没有直接关系,但在尝试使用邮件编辑器之前总是使用canSendMail()
  • 谢谢@rmaddy 我有 - 但它不包括在这里,因为它与我的问题无关,事实上作曲家是按预期呈现的
  • 不知道你的问题在哪里
  • 这里可能的错字:Constans.body
  • 除了Swift.Error之外,你没有私有类型Error吗?图片中的错误消息表明MFMailComposeViewControllerMFMailComposeResultError 三种类型中的任何一种都是私有类型。

标签: ios swift mfmailcomposeviewcontroller


【解决方案1】:

我将在 cmets 中强调的一些小改动:

import UIKit
import MessageUI

class MyViewController: UIViewController {

    // MARK: - Properties
    let composeViewController = MFMailComposeViewController()

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {
        composeViewController.mailComposeDelegate = self
        // Entered a generic email in place of your constant value
        composeViewController.setToRecipients(["someone@example.com"])
        // Entered a generic subject in place of your constant value
        composeViewController.setSubject("subject")
        // You have a typo on "Constants" here
        composeViewController.setMessageBody("body", isHTML: false)
        present(composeViewController, animated: true, completion: nil)
    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
    // Removed the private
    func mailComposeController(_ controller: MFMailComposeViewController,
                               didFinishWith result: MFMailComposeResult,
                               error: Error?) {
        switch result {
        case .sent:
            print("Email sent")
        case .saved:
            print("Draft saved")
        case .cancelled:
            print("Email cancelled")
        case  .failed:
            print("Email failed")
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

我的控制台日志显示已发送电子邮件

您是否确认您的常量对象包含有效数据?也许你应该打印出来或者在它到达这里时在断点处查看它,以确保它的内容没有问题。

此外,请确保您首先在设备上设置了有效的电子邮件帐户,以便为您发送电子邮件。如果它是开发设备,那么它可能在某个时候被重置并丢失了。

比较您的错误类型:

到我的:

注意Error 的颜色发生了变化。这意味着它正在使用您定义的错误,该错误的范围为私有。您需要通过将您的错误重命名为其他名称来打破这一点。完成后,它应该可以解决您的错误。

【讨论】:

  • 您是如何删除“私人”的?我得到:Method must be declared private because its parameter uses a private type
  • @etayluz 查看屏幕截图中错误的颜色,注意它与其他 MFMail* 类不同。这表明它正在使用您定义的错误。不久前我遇到了这个问题,只是将我的自定义错误枚举重命名为 ProjectNameError,它为我解决了这个特定问题。
【解决方案2】:
extension MyViewController: MFMailComposeViewControllerDelegate {
    private func mailComposeController(_ controller: MFMailComposeViewController,
                                       didFinishWith result: MFMailComposeResult,
                                       error: Error?)

再次检查你的委托方法,它应该是public

还要确保您的邮件帐户配置正确。

【讨论】:

  • 请看附图(不能将方法声明为公开)。有什么想法吗?
【解决方案3】:

我不知道你的问题在哪里

我测试你的代码它工作得很好,编译器没有强制我将委托设置为 private,注意电子邮件作曲家不能在 simulator 上工作,只是在 device

import UIKit
import MessageUI
class MyViewController: UIViewController {

    // MARK: - Properties
    let composeViewController = MFMailComposeViewController()

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {

        if MFMailComposeViewController.canSendMail() {
            composeViewController.mailComposeDelegate = self
            composeViewController.setToRecipients(["abdela7ad@gmail.com"])
            composeViewController.setSubject("Constants.contactSubjec")
            composeViewController.setMessageBody("Constans.body", isHTML: false)
            present(composeViewController, animated: true, completion: nil)        } else {
        }

    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {

            switch result {
            case .sent:
                print("Email sent")
            case .saved:
                print("Draft saved")
            case .cancelled:
                print("Email cancelled")
            case  .failed:
                print("Email failed")
            }
            controller.dismiss(animated: true, completion: nil)
    }
}

【讨论】:

  • 您能否让它在设备上运行?我做不到。
  • 是的,我收到了电子邮件,在单独的项目中尝试并分享该项目。如果你还有它。
  • 你是如何从 func mailComposeController 中删除私有的?在上面的图片中查看我的错误
  • 是的,我认为你做错了与MFMailComposeViewControllerDelegate 无关的事情,所以只需在单独的项目中检查我的代码并跟踪错误的位置
【解决方案4】:

我最近也遇到了类似的问题,我的解决方法是将声明移到按钮操作中

class MyViewController: UIViewController {

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {
        let composeViewController = MFMailComposeViewController()
        composeViewController.mailComposeDelegate = self
        composeViewController.setToRecipients([Constants.contactRecipientEmail])
        composeViewController.setSubject(Constants.contactSubject)
        composeViewController.setMessageBody(Constans.body, isHTML: false)
        present(composeViewController, animated: true, completion: nil)
    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
   func mailComposeController(_ controller: MFMailComposeViewController,
                                       didFinishWith result: MFMailComposeResult,
                                       error: Error?) {
        switch result {
        case .sent:
            print("Email sent")
        case .saved:
            print("Draft saved")
        case .cancelled:
            print("Email cancelled")
        case  .failed:
            print("Email failed")
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

您也不需要将委托方法设为私有

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多