无法关闭我从 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 语句中声明它来修复此问题。
我正在尝试从我的游戏应用程序中发送电子邮件。在我的一个 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 语句中声明它来修复此问题。