iosswiftmfmailcomposeviewcontrollermfmailcomposer

MFMailComposeViewController refuse to dismiss


This is driving me nuts. This snippet of code lets the user send an email with an image which is created within the app. Everything works perfectly except the self.dismiss(animated: true, completion: nil) - the MFMailComposeViewController won't dismiss.

I used these three possibly problems https://stackoverflow.com/a/13217443/5274566 as my start to solve the problem, but it still won't work. The controller stays despite the fact than an mail has been sent or cancel has been tapped.

The protocol implementation MFMailComposeViewControllerDelegate is added.

func mailOpen(alertAction: UIAlertAction) {
    if MFMailComposeViewController.canSendMail() {
        let mailcontroller = MFMailComposeViewController()
        mailcontroller.mailComposeDelegate = self;
        mailcontroller.setSubject("Subject")
        let completeImage = newImage! as UIImage
        mailcontroller.addAttachmentData(UIImageJPEGRepresentation(completeImage, CGFloat(1.0))!, mimeType: "image/jpeg", fileName: "Image")
        mailcontroller.setMessageBody("<html><body><p>Message</p></body></html>", isHTML: true)

        self.present(mailcontroller, animated: true, completion: nil)
    } else {
        let sendMailErrorAlert = UIAlertView(title: "Could Not Send Email", message: "Your device could not send the e-mail. Please check e-mail configuration and try again.", delegate: self, cancelButtonTitle: "Got it!")
        sendMailErrorAlert.show()
    }

    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
        self.dismiss(animated: true, completion: nil)
    }
}//end of mail

Solution

  • Issue is you have written the didFinishWithResult: delegate method inside the mailOpen function, so it will never be called and the dismissing code won't be executed ever.

    func mailOpen(alertAction: UIAlertAction)
    {
        if MFMailComposeViewController.canSendMail()
        {
            let mailcontroller = MFMailComposeViewController()
            mailcontroller.mailComposeDelegate = self;
            mailcontroller.setSubject("Subject")
            let completeImage = newImage! as UIImage
            mailcontroller.addAttachmentData(UIImageJPEGRepresentation(completeImage, CGFloat(1.0))!, mimeType: "image/jpeg", fileName: "Image")
            mailcontroller.setMessageBody("<html><body><p>Message</p></body></html>", isHTML: true)
    
            self.present(mailcontroller, animated: true, completion: nil)
    
        }
        else
        {
    
            let sendMailErrorAlert = UIAlertView(title: "Could Not Send Email", message: "Your device could not send the e-mail. Please check e-mail configuration and try again.", delegate: self, cancelButtonTitle: "Got it!")
            sendMailErrorAlert.show()
        }
    }//end of mail
    
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?)
    {
        self.dismiss(animated: true, completion: nil)
    }