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