我正在做一个允许用户发送邮件的屏幕。我为它写了一些代码,它运行良好:
import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let mailComposer = MFMailComposeViewController()
mailComposer.mailComposeDelegate = self
let recipients = ["fresher40@gmail.com"]
mailComposer.setToRecipients(recipients)
mailComposer.setSubject("Title")
mailComposer.setMessageBody("Hello", isHTML: false)
if MFMailComposeViewController.canSendMail() {
self.present(mailComposer, animated: true, completion: nil)
}
}
func mailComposeController(
_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult,
error: Error?
) {
controller.dismiss(animated: true, completion: nil)
}
}
然后我尝试将邮件发送功能移动到另一个名为“MailSender”的类中。所以它看起来像:
import UIKit
import MessageUI
class MailSender: NSObject, MFMailComposeViewControllerDelegate {
private var mailComposer = MFMailComposeViewController()
init(email: String) {
super.init()
mailComposer.mailComposeDelegate = self
let recipients = [email]
mailComposer.setToRecipients(recipients)
mailComposer.setSubject("Title")
mailComposer.setMessageBody("Hello", isHTML: false)
}
func presentOverViewController(viewController: UIViewController) {
if MFMailComposeViewController.canSendMail() {
viewController.present(mailComposer, animated: true, completion: nil)
}
}
func mailComposeController(
_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult,
error: Error?
) {
controller.dismiss(animated: true, completion: nil)
}
}
我的 View Controller 看起来是这样的:
import UIKit
import MessageUI
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let mailSender = MailSender(email: "someEmail@gmail.com")
mailSender.presentOverViewController(viewController: self)
}
}
在这种情况下,屏幕会打开发送邮件 View ,但在取消点击按钮后,应用程序会崩溃。我做错了什么?
最佳答案
问题可能是 mailSender
是一个本地的,在它有时间做任何事情之前就消失了:
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let mailSender = MailSender(email: "someEmail@gmail.com")
mailSender.presentOverViewController(viewController: self)
}
}
因此,您最终会得到委托(delegate)指向一个不存在的对象——当用户取消并且邮件撰写 View Controller 试图与该委托(delegate)对话时,这是一个简单的崩溃方法。我建议将其设为实例属性:
class ViewController: UIViewController {
var mailSender : MailSender!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.mailSender = MailSender(email: "someEmail@gmail.com")
self.mailSender.presentOverViewController(viewController: self)
}
}
关于swift - 使用 MFMailComposeViewController 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50883855/