Luke
Luke

Reputation: 7220

MFMailComposeViewController does not send email or dismiss

I'm using MFMailComposeViewController in a view controller with the following code:

if !MFMailComposeViewController.canSendMail() {
    return
}
let mailComposeViewController = MFMailComposeViewController()
mailComposeViewController.mailComposeDelegate = self
present(mailComposeViewController, animated: true)

And:

extension MyViewController : MFMailComposeViewControllerDelegate {
    private func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        controller.dismiss(animated: true, completion: nil)
    }
}

The MFMailComposeViewController shows as expected, but has the following behavior:

This is Xcode 11.2, iOS 13.2, Swift 4.

How can I fix this?

Upvotes: 1

Views: 1302

Answers (2)

Vladimir Lobanov
Vladimir Lobanov

Reputation: 1

Make sure that your class MyViewController is not a subclass of MFMailComposeViewController.

You should:

  1. Create a UIViewController subclass (class MailViewController: UIViewController)
  2. Add MFMailComposeViewController.
  3. MailViewController: MFMailComposeViewControllerDelegate

Or:

Configure MFMailComposeViewController() directly from another UIViewController. For example:

let mailComposeVC = MFMailComposeViewController()
mailComposeVC.mailComposeDelegate = self
mailComposeVC.setToRecipients([recipient])
mailComposeVC.setSubject(subject)
mailComposeVC.setMessageBody(body, isHTML: false)
present(mailComposeVC, animated: true, completion: nil)

Upvotes: 0

matt
matt

Reputation: 535925

In this code

extension MyViewController : MFMailComposeViewControllerDelegate {
    private func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        controller.dismiss(animated: true, completion: nil)
    }
}

Delete the keyword private. It hides the method from Cocoa so that it will never be called.

Upvotes: 2

Related Questions