MFMailComposeViewController в Swift не отклоняет

#objective-c #uiviewcontroller #swift #mfmailcomposeviewcontroller #ios8

#objective-c #uiviewcontroller #swift #mfmailcomposeviewcontroller #ios8

Вопрос:

Это пример кода:

 import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {

@IBAction func showEmail(sender : AnyObject) {
    var emailTitle = "Test Email"
    var messageBody = "This is a test email body"
    var toRecipents = ["a.nakhimov@gmail.com"]
    var mc: MFMailComposeViewController = MFMailComposeViewController()
    mc.mailComposeDelegate = self
    mc.setSubject(emailTitle)
    mc.setMessageBody(messageBody, isHTML: false)
    mc.setToRecipients(toRecipents)

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

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

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

}
  

Когда я нажимаю кнопку, выполняется функция showEmail и появляется форма для отправки электронной почты. Если я нажимаю «Отправить», то все работает нормально — почта отправляется, затем выполняется функция mailComposeController. NSLog отображает метку «Отправленная почта», и снова появляется начальный экран.

Если я нахожусь в диалоговом окне отправки почты, нажимаю кнопку «Отмена», то диалог не исчезает, функция mailComposeController не работает, две кнопки — «Отправить» и «Отмена», становятся серого цвета и так и остаются.

Что не так?

Ответ №1:

Вы пытаетесь отклонить self вместо MFMailComposeViewController (который не является self).

Заменить:

 self.dismissModalViewControllerAnimated(true)
  

с:

 controller.dismissViewControllerAnimated(true, completion: nil)
  

в методе делегирования.

Комментарии:

1. Только что попробовал: controller.dismissViewControllerAnimated(true, завершение: ноль) и controller.dismissModalViewControllerAnimated(true) — никаких изменений, MFMailCompose не отклоняется:-(

2. Моя проблема в том, что didFinishWithResult не сработал.

Ответ №2:

Похоже, это ошибка в iOS 8. Такая же проблема существует и в Objective-C.

Комментарии:

1. Черт! 🙂 Я уже перебрал сотни различных вариантов! 🙂

2. Эта ошибка все еще сохраняется?, я сталкиваюсь с такой же проблемой в Xcode6.0.1

3. presentingViewController отвечает за отклонение presentedViewController, а не за self

Ответ №3:

Ошибка устранена. Все работает, как ожидалось, в iOS 8.1 и Xcode 6.1

Следующее срабатывает и работает нормально

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