Cómo descartar el controller de vista de correo después de tocar el button de enviar o cancelar

mientras envía el correo, después de presionar el button de enviar o cancelar, el controller de vista se queda allí y la aplicación se detiene.

// Swift 2.2; xcode 7.3.1;

if( MFMailComposeViewController.canSendMail() ) { print("Can send email.") } var subjectText = "Verification" var toReceipients = ["notorious.roman@gmail.com"] // var msgBody = "Verified" var mc:MFMailComposeViewController = MFMailComposeViewController() mc.mailComposeDelegate = self mc.setSubject(subjectText) mc.setMessageBody("Verified", isHTML: false) mc.setToRecipients(toReceipients) self.presentViewController(mc, animated: true, completion: nil) } func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { self.dismissViewControllerAnimated(true, completion: nil) } 

Creo que @rmaddy responde tu pregunta en su comentario, sin embargo, voy a explicarte lo que está sucediendo. Está intentando descartar el UIViewController que presenta el MFMailComposeViewController no el MFMailComposeViewController .

Como Apple especifica en su documentation:

El controller de vista de composition de correo no se descarta automáticamente. Cuando el usuario toca los botones para enviar el correo electrónico o cancelar la interfaz, el controller de vista de composition de correo llama a mailComposeController:didFinishWithResult:error: método de su delegado. Su implementación de ese método debe descartar explícitamente al controller de vista.

Entonces debes configurar el método de esta manera:

  func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { // Dismiss the mail compose view controller. controller.dismissViewControllerAnimated(true, completion: nil) } 

Espero que esto te ayude.

Actualización Swift 3.0.

Permítame agregar algo a la discusión …

En Swift 3, el método delegado cambió ligeramente; Como está publicado por usted ahora, no hará ningún efecto y no recibirá llamadas. ¡Me pasó a mí, me enloqueció!

La advertencia de Xcode sugiere tres correcciones, pero las dos primeras podrían ser engañosas. Es solo una pequeña solución …

Aquí está el método de delegado fijo para Swift 3:

 func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { // Dismiss the mail compose view controller. controller.dismiss(animated: true, completion: nil) } 

Aun así, la respuesta de Victor debería ser la correcta / aceptada.

¡Disfrutar!

Tiene una statement de cambio que la controla por mí:

 func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { switch result.rawValue { case MFMailComposeResult.cancelled.rawValue : print("Cancelled") case MFMailComposeResult.failed.rawValue : print("Failed") case MFMailComposeResult.saved.rawValue : print("Saved") case MFMailComposeResult.sent.rawValue : print("Sent") default: break } self.dismiss(animated: true, completion: nil) }