Michael_Gruszka
Michael_Gruszka

Reputation: 43

MFMailComposeViewController doesn't read variable into message in Swift

I have small problem. I'm using MFMailComposeViewController to send email after work. So I have var allRuns, and I've printed that var in few places, and it always show value = 3. But in my MailViewController into MessageBody it's equal 0/nil (I've set 0). If it is important- I'm taking var from Firebase, but earlier in the app. Where should I seek problem? That's some code below.

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(["[email protected]"])
        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)
    
}

}

Few lines in 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: Should I use segue before MFMAilComposeViewController? If yes, how should I configure it?

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(["[email protected]"])
        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)
    }
}
}

Upvotes: 0

Views: 128

Answers (1)

Frankenstein
Frankenstein

Reputation: 16381

You seem to be missing the execution of allRunsFunc function. Maybe call it in the ActualValue init method.

Upvotes: 0

Related Questions