MFMailComposeViewController не считывает переменную в сообщение в Swift - PullRequest
0 голосов
/ 07 мая 2020

У меня небольшая проблема. Я использую MFMailComposeViewController для отправки электронной почты после работы. Итак, у меня есть var allRuns, и я напечатал этот var в нескольких местах, и он всегда показывает значение = 3. Но в моем MailViewController в MessageBody он равен 0 / nil (я установил 0). Если важно - я беру var из Firebase, но ранее в приложении. Где искать проблему? Это код ниже.

MailViewController:

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
        }
    }
}

EDIT: Следует ли мне использовать segue перед MFMAilComposeViewController? Если да, то как мне его настроить?

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)
    }
}
}

1 Ответ

0 голосов
/ 07 мая 2020

Кажется, вам не хватает выполнения функции allRunsFunc. Возможно, вызовите его в методе ActualValue init.

...