2016-10-04 10 views
3

Я использую почтовый композитор в нескольких своих приложениях некоторое время, и на сегодняшний день mailComposeDelegate больше не получает вызов.
Я не был уверен, что это связано с новой версией Swift.
Итак, я подумал, что попрошу и посмотрю, есть ли у кого-нибудь другие подобные проблемы.
Я могу представить композитора, но он никогда не увольняется из-за того, что делегат не работает.MFMailComposeViewControllerDelegate не работает Swift 3

Ниже приводится точная копия кода я использую:

func launchFeedback() { 
    guard MFMailComposeViewController.canSendMail() else { 
     return 
    } 

    let emailTitle = "Feedback" 
    let messageBody = "" 
    let toRecipents = ["[email protected]"] 
    mailComposer.mailComposeDelegate = self 
    mailComposer.setSubject(emailTitle) 
    mailComposer.setMessageBody(messageBody, isHTML: false) 
    mailComposer.setToRecipients(toRecipents) 
    self.show(mailComposer, sender: self) 
} 

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

ответ

1

Swift 3 больше не имеет неназванные первые параметры по умолчанию (см this proposal), так что вам нужно, чтобы добавить подчеркивание к вашему функция:

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

Это явно ошибка Xcode. Единственный способ обойти эту проблему (после поиска хотя StackOverflow жизни в течение часа) был такой:

@objc(mailComposeController:didFinishWithResult:error:) 
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult,error: NSError?) { 
     controller.dismiss(animated: true) 
    } 

См @objc макрос до реализации метода. Также обратите внимание, что последним параметром должен быть тип NSError вместо Error, как было предложено в документации Apple (и автозаполнено Xcode)

1

После того, как мы потратили 2 добрые часы, я пришел к выводу, что с Xcode 8.3. MFMailComposeViewController не работает в смешанной базе данных swift/objc. Он выскакивает нечетные ошибки компиляции, которые, по моему мнению, были связаны с моей глупостью, но нет.

Это настолько расстраивающее яблоко. У большинства из нас старые таймеры есть тонны кода на obj-c, поэтому быстрый быстрый сценарий близок к невозможности. Так как я перемещаю классы, чтобы быстро, я должен иметь дело с дополнительной болью также.

0

Swift 4, Xcode 9.1. Моя проблема заключалась в том, что MFMailComposeViewController работал нормально, но если вы нажмете отменить, уволите, а затем попытаетесь открыть его еще раз, то обе кнопки отмены и отправки не будут запускать функцию делегата didFinishWith. Это происходило, потому что я объявлял MFMailComposeViewController ленивой переменной, и решение заключалось в создании нового экземпляра MFMailComposeViewController каждый раз, когда вы хотите его открыть.

Проблема:

lazy var mailComposeViewController: MFMailComposeViewController = { 
    let mailComposeViewController = MFMailComposeViewController() 
    mailComposeViewController.mailComposeDelegate = self 
    mailComposeViewController.setToRecipients(["[email protected]"]) 
    mailComposeViewController.setSubject("subject") 
    mailComposeViewController.setMessageBody("test body", isHTML: false) 
    return mailComposeViewController 
}() 

Решение:

func createMailComposeViewController() -> MFMailComposeViewController { 
    let mailComposeViewController = MFMailComposeViewController() 
    mailComposeViewController.mailComposeDelegate = self 
    mailComposeViewController.setToRecipients(["[email protected]"]) 
    mailComposeViewController.setSubject("subject") 
    mailComposeViewController.setMessageBody("test body", isHTML: false) 
    return mailComposeViewController 
} 
Смежные вопросы