2016-12-21 5 views
0

Das macht mich verrückt. Mit diesem Code-Snippet kann der Benutzer eine E-Mail mit einem Bild senden, das in der App erstellt wurde. Alles funktioniert perfekt, außer die self.dismiss(animated: true, completion: nil) - die MFMailComposeViewController wird nicht entlassen.MFMailComposeViewController weigern sich zu entlassen

Ich habe diese drei möglichen Probleme https://stackoverflow.com/a/13217443/5274566 als mein Start, um das Problem zu lösen, aber es wird immer noch nicht funktionieren. Der Controller bleibt trotz der Tatsache, dass eine Mail gesendet wurde oder cancel wurde angezapft.

Die Protokollimplementierung MFMailComposeViewControllerDelegate wird hinzugefügt.

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 

Antwort

2

Ausgabe wird Sie die didFinishWithResult: Delegatmethode innerhalb der mailOpen Funktion geschrieben, so wird es nie und der entlassenden Code wird nicht immer ausgeführt aufgerufen werden.

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

öffnende Klammer sollte nicht gewickelt werden (siehe https://github.com/raywenderlich/swift-style-guide#spa cing). –

+2

@PEEJWEEJ Es gibt keinen Grund, die Antwort von jemandem zu ändern, nur um die Position geschweifter Klammern zu ändern. Verschiedene Menschen bevorzugen unterschiedliche Stile. – rmaddy

+0

@deville: Es gibt kein offizielles Dokument, das besagt, welcher Stil befolgt werden sollte. Ich bevorzuge diesen Stil, da es für mich sehr viel einfacher ist, die Klammer zu öffnen und zu schließen. –

-2

hier:

self.dismiss(animated: true, completion: nil)

Sie Ihre eigenen Viewcontroller zu entlassen, anstatt die MFMailComposeViewController

Es sollte:

controller.dismiss(animated: true, completion: nil) 
Verwandte Themen