SWIFT - mailComposeDelegate не вызывается: отмена MFMailComposeViewController не работает

На том же контроллере просмотра мы можем отправить электронное письмо или текстовое сообщение, чтобы отправить информацию другу. Текстовое сообщение в приложении полностью работает. Но для электронной почты приложение электронной почты открывается внутри моего приложения со всей информацией, которую я просил написать, но ее невозможно закрыть, нажав кнопку «Отмена», ничего не происходит. Я попробовал mc.mailComposeDelegate = self или mc.delegate = self, и MFMailComposeViewControllerDelegate также находится вверху. В инете все перерыл, объяснений не нашел. mailComposeController никогда не вызывается! Есть ли у вас какие-либо идеи ?

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

person Oscar Falmer    schedule 15.05.2016    source источник


Ответы (3)


У меня все работает без проблем, но мой метод делегата немного отличается от вашего:

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

person Jamal    schedule 15.05.2016
comment
Боже мой, это работает, я не знаю, кто вы, но спасибо вам 1000 раз! Хорошего дня! - person Oscar Falmer; 15.05.2016

В первую очередь используйте

mc.mailComposeDelegate = self

вместо

mc.delegate = self

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

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?){
    controller.dismiss(animated: true, completion: nil)
}
person Ghulam Rasool    schedule 10.08.2017
comment
это спасло мой день - person jonye._.jin; 31.03.2021

Для Swift 4:

switch result.rawValue {
    case MFMailComposeResult.cancelled.rawValue:
        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
    }
person Moe    schedule 06.01.2019