3

На том же контролере просмотра мы можем отправить электронное письмо или текстовое сообщение, чтобы отправить информацию другу. Текстовое сообщение в приложении полностью работает. Но для электронной почты приложение электронной почты открывается внутри моего приложения со всей информацией, которую я просил написать, но невозможно отменить ее, нажав на отмену, ничего не происходит. Я пробовал mc.mailComposeDelegate = self или mc.delegate = self и MFMailComposeViewControllerDelegate тоже наверху. Я посмотрел все в Интернете, я не нашел объяснений. mailCompositionController никогда не вызывается! У вас есть идеи?SWIFT - mailComposeDelegate not called: отмена MFMailComposeViewController не работает

class inviteAFriendViewController: UIViewController, MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate { 

@IBAction func emailButtonDidTouch(sender: AnyObject) { 
    sendEmail() 
} 

func sendEmail() { 
    let emailTitle = "text" 
    let messageBody = "text" 
    let toRecipents = [""] 

    let mc = MFMailComposeViewController() 

    //mc.mailComposeDelegate = self 

    mc.delegate = self 

    mc.setSubject(emailTitle) 
    mc.setMessageBody(messageBody, isHTML: false) 
    mc.setToRecipients(toRecipents) 

    presentViewController(mc, animated: true, completion: nil) 
} 

func mailComposeController(controller2: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { 
    switch result.rawValue { 
    case MFMailComposeResultCancelled.rawValue: 
     print("Mail cancelled") 
     controller2.dismissViewControllerAnimated(true, completion: nil) 
    case MFMailComposeResultSaved.rawValue: 
     print("Mail saved") 
     controller2.dismissViewControllerAnimated(true, completion: nil) 
    case MFMailComposeResultSent.rawValue: 
     print("Mail sent") 
     controller2.dismissViewControllerAnimated(true, completion: nil) 
    case MFMailComposeResultFailed.rawValue: 
     print("Mail sent failure.") 
     controller2.dismissViewControllerAnimated(true, completion: nil) 
    default: 
     break 
    } 
    controller2.dismissViewControllerAnimated(true, completion: nil) 
} 

ответ

13

Я получил это работает без каких-либо проблем, но мой метод делегата выглядит немного отличается от твоего:

func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError?) { 
    switch result.rawValue { 
    case MFMailComposeResultCancelled.rawValue: 
     print("Mail cancelled") 
    case MFMailComposeResultSaved.rawValue: 
     print("Mail saved") 
    case MFMailComposeResultSent.rawValue: 
     print("Mail sent") 
    case MFMailComposeResultFailed.rawValue: 
     print("Mail sent failure: %@", [error.localizedDescription]) 
    default: 
     break 
    } 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

вы можете попробовать это.

И вам нужно установить mc.mailComposeDelegate = self и не mc.delegate = self

+0

О, боже, это работает, я не знаю, кто вы, но спасибо 1000 раз! Хорошего дня! – Oscar

2

Прежде всего использовать

mc.mailComposeDelegate = self 

вместо

mc.delegate = self 

Кроме того, в случае Swift 3 , метод делегата как-то обновляется а именно:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?){ 
    controller.dismiss(animated: true, completion: nil) 
}