【发布时间】:2020-05-07 10:34:10
【问题描述】:
我有一个小问题。我正在使用 MFMailComposeViewController 下班后发送电子邮件。所以我有 var allRuns,我在几个地方打印了那个 var,它总是显示 value = 3。但是在我的 MailViewController 到 MessageBody 中它等于 0/nil(我设置了 0)。如果它很重要 - 我正在从 Firebase 获取 var,但在应用程序的早期。我应该去哪里找问题?这是下面的一些代码。
邮件视图控制器:
import UIKit
import MessageUI
class MailViewController: UIViewController, MFMailComposeViewControllerDelegate {
let av = ActualValues()
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: - Buttons
@IBAction func emailButtonTapped(_ sender: UIButton) {
showMailComposer()
}
@IBAction func backButtonTapped(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
//MARK: -Func
func showMailComposer() {
if MFMailComposeViewController.canSendMail() {
let mailComposer = MFMailComposeViewController()
mailComposer.mailComposeDelegate = self
mailComposer.setToRecipients(["paereson@gmail.com"])
mailComposer.setSubject("Work of \(av.currentDate())")
mailComposer.setMessageBody("All runs: \(av.allRuns)", isHTML: false)
present(mailComposer, animated: true, completion: nil)
}
}
func mailComposeController(_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult, error: Error?) {
if let _ = error {
//show alert
controller.dismiss(animated: true, completion: nil)
return
}
switch result {
case .cancelled:
print("Cancelled")
case .failed:
print("Failed")
case .saved:
print("saved")
case .sent:
print("Email sent")
@unknown default:
print("default")
}
controller.dismiss(animated: true, completion: nil)
}
}
av = ActualValuse 中的几行:
var allRuns: Int = 0
var runs: Array? = []
//All runs
func allRunsFunc() {
let ref1 = ref.child("\(currentYear())/\(currentMonth())/\(currentDay())")
ref1.observeSingleEvent(of: .value) { (snapshot) in
if let snapshots = snapshot.children.allObjects as? [DataSnapshot] {
self.allRuns = snapshots.count as Int
}
}
}
编辑: 我应该在 MFMAilComposeViewController 之前使用 segue 吗?如果是,我应该如何配置它?
import UIKit
import MessageUI
class MailViewController: UIViewController, MFMailComposeViewControllerDelegate {
let av = ActualValues()
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: - Buttons
@IBAction func emailButtonTapped(_ sender: UIButton) {
showMailComposer()
}
@IBAction func backButtonTapped(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
//MARK: -Func
func showMailComposer() {
if MFMailComposeViewController.canSendMail() {
let mailComposer = MFMailComposeViewController()
mailComposer.mailComposeDelegate = self
mailComposer.setToRecipients(["paereson@gmail.com"])
mailComposer.setSubject("Work of \(av.currentDate())")
mailComposer.setMessageBody("\(av.exportText())", isHTML: true)
present(mailComposer, animated: true, completion: nil)
}
}
func mailComposeController(_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult, error: Error?) {
if let _ = error {
//show alert
controller.dismiss(animated: true, completion: nil)
return
}
switch result {
case .cancelled:
print("Cancelled")
case .failed:
print("Failed")
case .saved:
print("saved")
case .sent:
print("Email sent")
@unknown default:
print("default")
}
controller.dismiss(animated: true, completion: nil)
}
func configureMail(model: ActualValues) {
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is MFMailComposeViewController {
let vc = segue.destination as? MFMailComposeViewController
vc?.configureMail(model: av)
}
}
}
【问题讨论】:
-
“我正在从 Firebase 获取 var,但在应用程序的早期”:我猜测是异步问题或实例问题。
let av = ActualValues(),这是创建一个新实例(与您可能调用的另一个实例无关)。所以它可能是另一个具有allRuns值的,而不是那个。如果没有,请在调用self.allRuns = snapshots.count as Int时打印,您将看到异步问题。 -
我应该使用segue吗?请参阅“编辑”。
标签: ios swift firebase mfmailcomposeviewcontroller