无法关闭我从 SKScene 调用的 MFMailComposeViewController



我正在尝试从我的游戏应用程序中发送电子邮件。在我的一个SKScenes中,当你按下它时,我有一个精灵,它调用FeedbackVC((.sendEmail((。这将打开电子邮件视图控制器,但它不会正确关闭。这是我的整个FeedbackVC课程。我使用了函数getTopMostViewController,因为没有它,我会收到错误"警告:尝试显示其视图不在窗口层次结构中!我的代码将成功打开带有预填充字段的 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 类,调用 emailButtonTapped 方法,然后在退出 if 语句时从内存中释放该类。这意味着单击"取消"或"发送"将尝试访问已解除分配的空间,从而导致EXC_BAD_ACCESS错误。我通过将 vc 声明为类变量而不是在 if 语句中声明它来解决此问题。

最新更新