Jacobo Koenig
Jacobo Koenig

Reputation: 12534

MFMailComposeViewControllerDelegate not being called

I realize this question has been inexactly asked around, but I haven't been able to find an answer to my problem.

I have a UITableViewController with static cells. One of these cells is meant to open a Mail Composer view, and dismiss it through the delegate after the user sends or cancels the email. My problem is that the delegate method is not being called. Here is my code:

class SideMenuTableViewController: UITableViewController, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate {

 override func viewDidLoad() {
        super.viewDidLoad()

        mailCVP.delegate = self
mailCVP = configureMailComposeVC()
            if MFMailComposeViewController.canSendMail() {
                self.presentViewController(mailCVP, animated: true, completion: nil)
            } else { //..// }
}

func configureMailComposeVC() -> MFMailComposeViewController {
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.setToRecipients(["[email protected]"])
            mailComposerVC.setSubject("Contacto Momentos de Tora")

        return mailComposerVC
    }

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
        controller.dismissViewControllerAnimated(true, completion: nil)
    }

Can anybody spot anything I might be doing wrong?

Thanks.

Upvotes: 3

Views: 1785

Answers (4)

Ghulam Rasool
Ghulam Rasool

Reputation: 4064

First of all use

mailCVP.mailComposeDelegate = self

instead of

mailCVP.delegate = self

Moreover, in case of Swift 3, delegate method is somehow updated which is:

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

Upvotes: 1

Kuldeep Singh
Kuldeep Singh

Reputation: 334

Make sure you use

controller.mailComposeDelegate = self

Not this one

controller.delegate = self

Upvotes: 6

EmilioPelaez
EmilioPelaez

Reputation: 19932

MFMailComposeViewController is a subclass of UINavigationController, which already has a delegate property to handle navigation changes.

MFMailComposeViewController has another property called mailComposeDelegate, which is the property you are looking for.

Also, you should create the controller before setting the delegate.

Upvotes: 8

Wain
Wain

Reputation: 119041

mailCVP.delegate = self
mailCVP = configureMailComposeVC()

This code sets the delegate but then creates a new instance, which doesn't have a delegate...

Note that there is also no point in creating the VC instance if MFMailComposeViewController.canSendMail returns false.

Upvotes: 1

Related Questions