无法关闭我从 SKScene 调用的 MFMailComposeViewController

Cannot dismiss MFMailComposeViewController that I called from SKScene

我正在尝试从我的游戏应用程序中发送电子邮件。在我的一个 SKScenes 中,当你按下它时我有一个精灵,它调用 FeedbackVC().sendEmail()。这会打开电子邮件 viewController,但无法正确关闭。这是我的整个 FeedbackVC class。我使用函数 getTopMostViewController 因为没有它我会得到错误 "Warning: Attempt to present on whose view is not in the window hierarchy!"。我的代码将成功打开带有预填充字段的 MFMailComposeViewController,如果我按下发送按钮,它实际上会将电子邮件发送到我的电子邮件,但它不会关闭,如果我尝试取消电子邮件,它会成功'关闭要么。为什么我的 viewController 不会关闭,所以它会在电子邮件发送或取消后继续回到我的游戏?

import Foundation
import MessageUI

class FeedbackVC: UINavigationController, MFMailComposeViewControllerDelegate {

    func getTopMostViewController() -> UIViewController? {
        var topMostViewController = UIApplication.shared.keyWindow?.rootViewController
        while let presentedViewController = topMostViewController?.presentedViewController {
            topMostViewController = presentedViewController
        }
        return topMostViewController
    }

    func sendEmail() {
        if MFMailComposeViewController.canSendMail() {
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self

            mail.setToRecipients(["support@supportemail.com"])
            mail.setSubject("In-App Feedback")
            mail.setMessageBody("", isHTML: false)
            self.getTopMostViewController()!.present(mail, animated: true, completion: nil)
        } else {
            print("Failed To Send Email!")
        }
    }

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

我也试过在 sendEmail() 函数中设置 UINavigationControllerDelegate。

mail.delegate = self as? UINavigationControllerDelegate

我也尝试过弹出视图控制器并返回到 mailComposeController 中最顶层的视图控制器。

popToRootViewContoller(animated: true)

getTopMostViewController()?.dismiss(animated: true, completion: nil)

我已经尝试按照 https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontroller 上的指南进行操作,但它没有用,因为我认为我的情况有所不同,因为我从 SKScene 转到 MFMailCompose ViewController 然后返回到 SKScene。

我是从事此项目的其他开发人员之一。发帖以防有人遇到类似问题。

我们试图以如下方式调用我们的 FeedbackVC:

if nodeTapped.name == "Feedback" {
  let vc = FeedbackVC()
  vc.emailButtonTapped(foo)
}

这将创建 FeedbackVC class,调用 emailButtonTapped 方法,然后在退出 if 语句时从内存中释放 class。这意味着单击取消或发送将尝试访问已释放的 space,从而导致 EXC_BAD_ACCESS 错误。我通过将 vc 声明为 class 变量而不是在 if 语句中声明它来修复此问题。