MailComposer 未关闭

MailComposer not dismissed

我尝试使用 MailComposer。这是我使用的代码:

func setupMailer() {
    if MFMailComposeViewController.canSendMail() {
        emailController.mailComposeDelegate = self
        emailController.setToRecipients([]) // set the email address
        emailController.setSubject("BackgroundTask Test")
        emailController.setMessageBody("Message body", isHTML: false)
    }
}

然后当用户按下按钮时:

func buttonPressed(button: UIButton) {
    debugPrint("buttonPressed", button)
    let path = dirpath.appendingPathComponent(filename)
    let data = NSData(contentsOfFile: path.path)
    emailController.mailComposeDelegate = self
    emailController.addAttachmentData(data! as Data, mimeType: "text/csv", fileName: filename)
    present(emailController, animated: true, completion: nil)
}

解雇时:

@objc func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    debugPrint("mailComposeController dismiss")
    controller.dismiss(animated: true, completion: nil)
}

发现如果是第一次按下按钮,无论我选择发送还是取消,邮件编辑器都正常工作。

但是,在我send/cancel之后,第2次以后,邮件编辑器不能被解雇。发送有可以发送电子邮件的响应,但邮件编写器界面永远不会关闭。

我发现函数func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)在第一次触发后就不再触发了

有什么线索吗?

您不应该再次使用同一个 MFMailComposeViewController 实例..

试试这个

func setupMailer() {
    if MFMailComposeViewController.canSendMail() {
        emailController = MFMailComposeViewController.init()
        emailController.mailComposeDelegate = self
        emailController.setToRecipients([]) // set the email address
        emailController.setSubject("BackgroundTask Test")
        emailController.setMessageBody("Message body", isHTML: false)
    }
}

好吧不知道你做错了什么。 我认为您正在使用 Swift。因此,我将向您解释如何实施它。步骤:

1) import MessagesUI 并添加代表 MFMailComposeViewControllerDelegate

2) 添加此功能:

func configuredMailComposeViewController() -> MFMailComposeViewController {
    let mailComposerVC = MFMailComposeViewController()
    mailComposerVC.mailComposeDelegate = self
    mailComposerVC.setToRecipients(["someone@somewhere.com"])
    mailComposerVC.setSubject("Sending you an in-app e-mail...")
    mailComposerVC.setMessageBody("Sending e-mail in-app is not so bad!", isHTML: false)

    return mailComposerVC
}

3) 在按钮的IBAction中调用上述函数为:

let mailComposeViewController = configuredMailComposeViewController()
    if MFMailComposeViewController.canSendMail() {
        self.present(mailComposeViewController, animated: true, completion: nil)
    } else {
        // Show alert if user can't send mail
    }

4) 最后实现委托方法:

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

对,关键是我重用了 emailController 实例。

  func setupMailer() {
if MFMailComposeViewController.canSendMail() {
  emailController = MFMailComposeViewController()
  emailController.mailComposeDelegate = self
  emailController.setToRecipients([]) // set the email address
  emailController.setSubject("BackgroundTask Test")
  emailController.setMessageBody("Message body", isHTML: false)
}

}

  func buttonPressed(button: UIButton) {
    debugPrint("buttonPressed", button)
    let path = dirpath.appendingPathComponent(filename)
    let data = NSData(contentsOfFile: path.path)
    setupMailer()
    emailController.addAttachmentData(data! as Data, mimeType: "text/csv", fileName: filename)
    present(emailController, animated: true, completion: nil)
  }

  @objc func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    debugPrint("mailComposeController dismiss")
    controller.dismiss(animated: true, completion: nil)
  }

现在有效。