Swift中的MFMailComposeViewController无法取消。

9
这是一个示例代码:

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显示标签“Mail sent”,然后初始屏幕重新出现。
如果我在发送邮件的对话框中,点击“取消”按钮,则对话框不会消失,函数 mailComposeController 不起作用,“发送”和“取消”两个按钮变为灰色,一直保持这样。
问题出在哪里?
3个回答

3
你试图取消 self 而不是 MFMailComposeViewController(它不是 self)。
请替换为:
self.dismissModalViewControllerAnimated(true)

使用:

controller.dismissViewControllerAnimated(true, completion: nil)

在委托方法中。

刚试了一下:controller.dismissViewControllerAnimated(true, completion: nil)controller.dismissModalViewControllerAnimated(true) - 没有变化,MFMailCompose没有被解除显示 :-( - Alexey Nakhimov
6
我的问题是 didFinishWithResult 没有触发。 - Bagusflyer

2

问题已得到解决。在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)
    }
}

2

iOS 8似乎存在bug。Objective-C也存在同样的问题。


该死! :-) 我已经浏览了数百个不同的选项! :-) - Alexey Nakhimov
这个 bug 还存在吗?我在 Xcode6.0.1 中遇到了同样的问题。 - BaSha
presentingViewController 负责解除 presentedViewController,而不是 self。 - Yariv Nissim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接