MFMailComposeViewController in Swift does not dismiss

This is sample code:

import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

@IBAction func showEmail(sender : AnyObject) {
    var emailTitle = "Test Email"
    var messageBody = "This is a test email body"
    var toRecipents = ["a.nakhimov@gmail.com"]
    var mc: MFMailComposeViewController = MFMailComposeViewController()
    mc.mailComposeDelegate = self
    mc.setSubject(emailTitle)
    mc.setMessageBody(messageBody, isHTML: false)
    mc.setToRecipients(toRecipents)

    self.presentViewController(mc, animated: true, completion: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {
    switch result.value {
    case MFMailComposeResultCancelled.value:
        NSLog("Mail cancelled")
    case MFMailComposeResultSaved.value:
        NSLog("Mail saved")
    case MFMailComposeResultSent.value:
        NSLog("Mail sent")
    case MFMailComposeResultFailed.value:
        NSLog("Mail sent failure: %@", [error.localizedDescription])
    default:
        break
    }
    self.dismissModalViewControllerAnimated(true)
    // self.dismissViewControllerAnimated(true, completion: nil)
}

}

When I push the button, the function showEmail is executed and appears the form for send email. If I click “Send”, then everything works fine – mail is sent, then the function mailComposeController is executed. NSLog displays the label “Mail sent” and the initial screen reappears.

  • The connection to service named com.apple.nsurlstorage-cache was invalidated
  • How to use TouchID using Swift?
  • Why requestWhenInUseAuthorization doesn't prompt the user for access to the location?
  • NSURLCache does not clear stored responses in iOS8
  • How do I subclass a variable with an IBOutlet?
  • How do I adjust CMMotionManager data for orientation under iOS 8?
  • If I’m in the dialog box of send mail, click “Cancel” button, then dialogue does not disappear, function mailComposeController does not work, two buttons – “Send” and “Cancel”, becoming gray color and so it stays.

    What wrong?

    3 Solutions Collect From Internet About “MFMailComposeViewController in Swift does not dismiss”

    Seems to be bug in iOS 8. Same problem exist in Objective-C also.

    You’re trying to dismiss self instead of the MFMailComposeViewController (which isn’t self).

    Replace:

    self.dismissModalViewControllerAnimated(true)
    

    with:

    controller.dismissViewControllerAnimated(true, completion: nil)
    

    in the delegate method.

    Bug has been resolved. Everything is working as expected in iOS 8.1+ and Xcode 6.1+

    The following fires and works fine

    extension MainViewController: MFMailComposeViewControllerDelegate {
        func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) {
            switch result.value {
            case MFMailComposeResultCancelled.value:
                NSLog("Mail cancelled")
            case MFMailComposeResultSaved.value:
                NSLog("Mail saved")
            case MFMailComposeResultSent.value:
                NSLog("Mail sent")
            case MFMailComposeResultFailed.value:
                NSLog("Mail sent failure: %@", [error.localizedDescription])
            default:
                break
            }
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    }