In response to needing more information, FreshImage1, FreshImage2, and FreshImage3 refer to the types of images imported by the user. The user will have already selected these images from the prior view controller.
The app has no problem sending the correct image data to SMS, as when three photos are available, the text message attaches them correctly.
The issue is instructing the app that they can be sent even if fewer than three photos are present. Right now, if any less than three photos are available when "Submit Now" is pressed, then the app crashes.
Here is the complete code for reference:
language
import UIKit
import MessageUI
class FourthScreenViewController: UIViewController, MFMessageComposeViewControllerDelegate, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
func numberOfComponents(in pickerView: UIPickerView) - Int {
return 1
}
func pickerView( _ pickerView: UIPickerView, numberOfRowsInComponent component: Int) - Int {
if currentTxtFldTag == 10
{
return pickOption.count
}
else
{
return ageOption.count
}
}
func pickerView( _ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) - String? {
if currentTxtFldTag == 10
{
return pickOption[row]
}
else
{
return ageOption[row]
}
}
func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if currentTxtFldTag == 10
{
notesField.text = pickOption[row]
self.view.endEditing(true)
}
else
{
TimeOfDay.text = ageOption[row]
self.view.endEditing(true)
}
}
func textFieldShouldBeginEditing(_ textField: UITextField) - Bool {
if textField.tag == 10 // WEIGHT OPTION
{
currentTxtFldTag = 10
}
else // AGE OPTION
{
currentTxtFldTag = 20
}
pickerView.reloadAllComponents()
return true
}
let ageOption = [String](arrayLiteral: "I need a free quote on site.", "I may have more than what's shown.", "I need scheduling/pricing for ONLY what's shown.", "I have a question not offered here.")
let pickOption = [String](arrayLiteral: "Morning", "Mid-Morning", "Mid-Day", "Afternoon")
let pickerView = UIPickerView()
var currentTxtFldTag : Int = 10
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
self.dismiss(animated: true, completion: nil)
}
@IBOutlet weak var FreshImage1: UIImageView!
var newImage: UIImage!
@IBOutlet weak var FreshImage2: UIImageView!
var newImage2: UIImage!
@IBOutlet weak var FreshImage3: UIImageView!
var newImage3: UIImage!
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var addressField: UITextField!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var notesField: UITextField!
@IBOutlet weak var TimeOfDay: UITextField!
@IBAction func SubmitNow(_ sender: Any) {
print("Submission Button Has Been Pressed")
if (MFMessageComposeViewController.canSendText()) && (MFMessageComposeViewController.canSendAttachments()) {
let controller = MFMessageComposeViewController()
controller.body = "Name: \(nameField.text!) \n\nAddress: \(addressField.text!) \n\nEmail: \(emailField.text!) \n\nTime of Day: \(notesField.text!) \n\nNotes: \(TimeOfDay.text!)"
controller.recipients = [" our phone number "]
controller.messageComposeDelegate = self
let image1 = FreshImage1.image!
let dataImage1 = image1.jpegData(compressionQuality: 100)
guard dataImage1 != nil else { return }
controller.addAttachmentData(dataImage1!, typeIdentifier: "image/jpeg", filename: "Image1.jpeg")
self.present(controller, animated: true, completion: nil)
let image2 = FreshImage2.image!
let dataImage2 = image2.jpegData(compressionQuality: 100)
guard dataImage2 != nil else { return }
controller.addAttachmentData(dataImage2!, typeIdentifier: "image/jpeg", filename: "Image2.jpeg")
self.present(controller, animated: true, completion: nil)
let image3 = FreshImage3.image!
let dataImage3 = image3.jpegData(compressionQuality: 100)
guard dataImage3 != nil else { return }
controller.addAttachmentData(dataImage3!, typeIdentifier: "image/jpeg", filename: "Image3.jpeg")
self.present(controller, animated: true, completion: nil)
}
}
@IBAction func HomeButton(_ sender: Any) {
self.performSegue(withIdentifier: "GoHome3", sender: self)
}
@IBAction func BackButton2(_ sender: Any) {
self.performSegue(withIdentifier: "Back1", sender: self)
}
override func viewDidLoad() {
super.viewDidLoad()
FreshImage1.image = newImage
FreshImage2.image = newImage2
FreshImage3.image = newImage3
pickerView.delegate = self
pickerView.dataSource = self
notesField.tag = 10
TimeOfDay.tag = 20
notesField.delegate = self
TimeOfDay.delegate = self
notesField.inputView = pickerView
TimeOfDay.inputView = pickerView
overrideUserInterfaceStyle = .light
// Do any additional setup after loading the view.
}
@IBAction func dismissKeyboard(_ sender: Any) {
self.resignFirstResponder()
}
}