2016-05-15 7 views
5

durante l'invio della posta, dopo aver toccato il pulsante di invio o annullamento, il controller di visualizzazione rimane lì e le chiusure delle app.come ignorare il controller di visualizzazione della posta dopo aver toccato il pulsante di invio o annullamento

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

chiamata 'dismissViewControllerAnimated' su' controller', non 'self'. – rmaddy

risposta

6

Penso che @rmaddy risponda alla tua domanda nel suo commento, tuttavia ti spiegherò cosa sta succedendo. Stai cercando di ignorare lo UIViewController che presenta lo MFMailComposeViewController non lo MFMailComposeViewController.

Come Apple specificare nella sua documentazione:

La posta controller della vista di composizione non è respinta automaticamente. Quando l'utente tocca i pulsanti per inviare l'e-mail o annullare l'interfaccia, il controller di visualizzazione della posta elettronica chiama il metodo mailComposeController:didFinishWithResult:error: del delegato. L'implementazione di tale metodo deve ignorare esplicitamente il controller della vista.

quindi è necessario impostare il metodo in questo modo:

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

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

Spero che questo aiuto.

+0

ha funzionato! grazie –

13

Aggiornamento Swift 3.0. Aggiornamento Swift 4.0.

mi permetta di aggiungere qualcosa alla discussione ...

a Swift 3 e 4 il metodo delegato leggermente modificato; Ora che è stato pubblicato da te, non produrrà alcun effetto e non verrà chiamato. È successo a me, mi ha fatto impazzire!

L'avviso Xcode suggerisce tre correzioni, ma le prime due potrebbero essere fuorvianti. E 'solo una piccola correzione ...

Ecco il metodo delegato fisso per Swift 3 e 4:

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

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

Eppure, la risposta di Victor dovrebbe essere il corretto/accettato.

Divertiti!

+0

Sembra che la differenza sia la barra inferiore nella dichiarazione della funzione. –

3

si ha un'istruzione switch che controlla per me:

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) 

} 
Problemi correlati