swift email segue

Swift 3 Cómo mostrar una pantalla de confirmación basada en la pantalla de correo electrónico MFMailComposeResult



email segue (2)

Estoy creando una aplicación que construye un correo electrónico y lo presenta en un MFMailComposeViewController para que el usuario lo envíe. Cuando el usuario lo envía o lo cancela, quiero que la aplicación responda con un mensaje de pantalla de confirmación apropiado.

Puedo redactar el correo electrónico, cerrar la pantalla de redacción y tengo un segue con nombre en IB desde la vista de precomposición a la vista de confirmación. Pero no puedo hacer que esa secuencia se ejecute.

Entonces, ¿cómo puedo actualizar el mensaje de texto en el destino segue y luego seguirlo?

Como estoy tratando de aprender Swift, estoy muy interesado en comprender cómo funciona el código, no solo en obtener el código que funciona. Así que realmente aprecio cualquier ayuda.

El flujo de trabajo comienza cuando el usuario toma una foto de la aplicación:

func snapPhoto(){ if let cameraConnection = sessionOutput.connection(withMediaType: AVMediaTypeVideo) { sessionOutput.captureStillImageAsynchronously(from: cameraConnection, completionHandler: { buffer, error in let myMessage = self.buildEmail() let myJpg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) let mapSnap = (self.myMap == nil) ? nil : UIImagePNGRepresentation(self.myMap!) let mail = self.setupMail(to: myMessage.to, subject: myMessage.subject, body: myMessage.body, myJpg: myJpg!, mapSnap: mapSnap) self.presentMailComposer(mail: mail) }) // close completionHandler } // close if let cameraConnection } // close func snapPhoto

Que reúne todo el contenido del mensaje de correo electrónico y lo pasa a:

func presentMailComposer(mail : MFMailComposeViewController) { if MFMailComposeViewController.canSendMail() { self.present(mail, animated: true, completion: nil) } else { let sendMailErrorAlert = UIAlertController.init(title: "Uh oh!", message: "Unable to send email.", preferredStyle: .alert) self.present(sendMailErrorAlert, animated: true, completion: nil) } // close if } // close presentEmailComposer

Y luego esto se dispara cuando el usuario toca "Enviar" de "Cancelar"

public func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { switch result.rawValue { case MFMailComposeResult.cancelled.rawValue: self.performSegue(withIdentifier: "afterEmail", sender: self) print("Mail cancelled") case MFMailComposeResult.saved.rawValue: print("Mail saved") case MFMailComposeResult.sent.rawValue: print("Mail sent") case MFMailComposeResult.failed.rawValue: print("Mail sent failure: %@", [error!.localizedDescription]) default: break } controller.dismiss(animated: true, completion: nil) } // close mailCompose

Y aquí es donde me encuentro perplejo. Puedo acceder a MFMailComposeResult, y es correcto, pero no puedo entender cómo presentar la vista de confirmación para que esté disponible a medida que la vista de redacción se desliza.


Debe hacer que su controlador de vista sea el delegado MFMailComposeViewController y anular el método didFinishWith result y cambiar el valor MFMailComposeResult dentro del controlador de finalización del método de descarte:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { controller.dismiss(animated: true) { // do whatever you need to do after dismissing the mail window switch result { case .cancelled: print("cancelled") case .saved: print("saved") case .sent: let alert = UIAlertController(title: "Mail Composer", message: "Mail was successfully sent", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Done", style: .default, handler: nil)) self.present(alert, animated: true) case .failed: print("failed") } } }


Si desea presentar una alerta antes de que se descarte el controlador? Prueba este:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { switch result { case .cancelled: let alertController = UIAlertController.init(title: "Cancelled", message: "Some message", preferredStyle: .alert) alertController.addAction(UIAlertAction.init(title: "Ok", style: .default, handler: { (alertAction) in controller.dismiss(animated: true, completion: nil) })) controller.present(alertController, animated: true, completion: nil) case .sent: let alertController = UIAlertController.init(title: "Sent", message: "Some message", preferredStyle: .alert) alertController.addAction(UIAlertAction.init(title: "Ok", style: .default, handler: { (alertAction) in controller.dismiss(animated: true, completion: nil) })) controller.present(alertController, animated: true, completion: nil) default: break; } }