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) }