2016-05-15 6 views
5

beim Senden von E-Mail, nach Tippen auf Senden oder Abbrechen Schaltfläche Ansicht Controller bleibt dort und App stalls.wie Mail-View-Controller nach dem Tippen auf senden oder Abbrechen Schaltfläche

// swift 2.2; xcode 7.3.1;

if(MFMailComposeViewController.canSendMail()) { 
      print("Can send email.") 
     } 

     var subjectText = "Verification" 
     var toReceipients = ["[email protected]"] 


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

    } 
+0

Anruf 'dismissViewControllerAnimated' auf' controller', nicht 'self'. – rmaddy

Antwort

6

Ich denke @rmaddy beantworten Ihre Frage in seinem Kommentar, trotzdem werde ich Ihnen erklären, was passiert. Sie versuchen, die UIViewController, die die MFMailComposeViewController nicht die MFMailComposeViewController präsentiert zu entlassen.

Als Apple in seiner Dokumentation angeben:

Der Mail-Controller compose Ansicht des Feldes verwiesen nicht automatisch. Wenn der Benutzer auf die Schaltflächen tippt, um die E-Mail zu senden oder die Schnittstelle abzubrechen, ruft der E-Mail-Verfassen-Ansichtscontroller die mailComposeController:didFinishWithResult:error:-Methode seines Delegaten auf. Ihre Implementierung dieser Methode muss den Ansichtscontroller explizit schließen.

So müssen Sie das Verfahren auf diese Weise eingestellt werden:

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { 

    // Dismiss the mail compose view controller. 
    controller.dismissViewControllerAnimated(true, completion: nil) 
} 

Ich hoffe, dass diese Ihnen helfen.

+0

hat es funktioniert! danke –

13

Swift 3.0 Update. Swift 4.0 Update.

Lassen Sie mich etwas zur Diskussion hinzufügen ...

In Swift 3 und 4 der Delegatmethode leicht verändert; Da es jetzt von Ihnen gepostet wird, wird keine Wirkung und wird nicht aufgerufen. Es ist mir passiert, hat mich verrückt gemacht!

Die Xcode-Warnung schlägt drei Fehler vor, aber die ersten zwei könnten irreführend sein. Es ist nur ein winziger fix ...

Hier ist die delegierte Methode für Swift Fest 3 und 4:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 

     // Dismiss the mail compose view controller. 
     controller.dismiss(animated: true, completion: nil) 
    } 

Dennoch Victor Antwort sollte die richtige sein/akzeptiert ein.

Viel Spaß!

+0

Es sieht aus wie der Unterschied ist die Unterstreichung in der Funktionsdeklaration. –

3

ist eine Switch-Anweisung hat, dass es für mich kontrolliert:

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) 

} 
Verwandte Themen