Search code examples
iosswiftmfmailcomposeviewcontroller

Can't get app to dismiss the mail compose view controller & return to first screen


I'm using the Swift book to try to learn to code. I added the delegate method to dismiss the view, but it's not working. What am I missing here?

@IBAction func emailButtonTapped(_ sender: UIButton) {

    if !MFMailComposeViewController.canSendMail() {
        print("Can not send mail")
        return
    }

    guard MFMailComposeViewController.canSendMail() else { return }

    let mailComposer = MFMailComposeViewController()
    mailComposer.mailComposeDelegate = self

    mailComposer.setToRecipients(["[email protected]"])
    mailComposer.setSubject("Look at this")
    mailComposer.setMessageBody("Hello, this is an email from the app I made.", isHTML: false)

    present(mailComposer, animated: true, completion: nil)

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

}

Solution

  • You just need to declare the delegate function outside of the IBAction:

    @IBAction func emailButtonTapped(_ sender: UIButton) {
        if !MFMailComposeViewController.canSendMail() {
            print("Can not send mail")
            return
        }
    
        guard MFMailComposeViewController.canSendMail() else { return }
    
        let mailComposer = MFMailComposeViewController()
        mailComposer.mailComposeDelegate = self
    
        mailComposer.setToRecipients(["[email protected]"])
        mailComposer.setSubject("Look at this")
        mailComposer.setMessageBody("Hello, this is an email from the app I made.", isHTML: false)
    
        present(mailComposer, animated: true, completion: nil)
    }
    
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        dismiss(animated: true, completion: nil)
    }