TextField value change with PickerViews

Hi everybody

I have a code that works properly (see below) but I want to add a thing.

Now to change the value on TextField2 I need to enter every time a value on TextField1. What I'm looking for is to keep value on TextField1 and obtain different values on TextField2 by changing values on PickerViews 1 and/or 2.


import UIKit

class ConversorDistanciaSubViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {

    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var textField2: UITextField!
    @IBOutlet weak var labelField1: UILabel!
    @IBOutlet weak var labelField2: UILabel!
    @IBOutlet weak var pickerView1: UIPickerView!
    @IBOutlet weak var pickerView2: UIPickerView!
    
    let udd1 = 0
    let udd2 = 0
    
    let distances = ["Milímetro", "Centímetro", "Metro", "Kilómetro", "Yardas", "Pulgada", "Pie", "Milla", "Milla Náutica"]
    let abreviaturas = ["mm", "cm", "m", "km", "yd", "in", "ft", "mi", "nmi"]
    
    
@IBAction func textField1EntryValue(_ sender: UITextField) {
    
    var udd1 = Double(textField1.text!)
    var udd2 = Double(textField2.text!)
        
        if (udd1 != nil)
        {
            // Primera medida Milímetros
            
            if (labelField1.text == labelField2.text) {
                textField2.text = textField1.text
            }
            if (labelField1.text == "mm") {
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*0.1
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "m") {
                    let udd2 = udd1!*0.001
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*0.000001
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*0.00109361
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*0.0393701
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*0.00328084
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*0.00000062137
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.00000053996
                    textField2.text = String(udd2)
                    }
                }
            
            // Segunda medida Centímetros
            
            if (labelField1.text == "cm") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*10
                    textField2.text = String(udd2)
                    }
                if (labelField1.text == "m") {
                    let udd2 = udd1!*1
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*0.00001
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*0.0109361
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*0.393701
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*0.0328084
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*0.0000062137
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.0000053996
                    textField2.text = String(udd2)
                    }
                }
            
            // Tercera medida Metros
            
            if (labelField1.text == "m") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*1000
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*100
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*0.001
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*1.09361
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*39.3701
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*3.28084
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*0.00062137
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.00053996
                    textField2.text = String(udd2)
                    }
                }
            
            // Cuarta medida Kilómetro
            
            if (labelField1.text == "km") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*1000000
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*100000
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "m") {
                    let udd2 = udd1!*1000
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*1093.61
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*39370.1
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*3280.84
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*0.62137
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.53996
                    textField2.text = String(udd2)
                    }
                }
            
            // Quinta medida Yarda
            
            if (labelField1.text == "yd") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*914.4
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*91.44
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "m") {
                    let udd2 = udd1!*0.9144
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*0.0009144
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*36
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*3
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*0.000568182
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.000493737
                    textField2.text = String(udd2)
                    }
                }
            
            // Sexta medida Pulgada
            
            if (labelField1.text == "in") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*25.4
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*2.54
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "m") {
                    let udd2 = udd1!*0.0254
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*0.0000254
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*0.0277778
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*0.0833333
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*0.000015783
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.000013715
                    textField2.text = String(udd2)
                    }
                }
            
            // Séptima medida Pie
            
            if (labelField1.text == "ft") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*304.8
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*30.48
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "m") {
                    let udd2 = udd1!*0.3048
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*0.0003048
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*0.333333
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*12
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*0.000189394
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.000164579
                    textField2.text = String(udd2)
                    }
                }
            
            // Octava medida Milla
            
            if (labelField1.text == "mi") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*1609340
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*160934
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "m") {
                    let udd2 = udd1!*1609.34
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*1.60934
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*1760
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*63360
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*5280
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "nmi") {
                    let udd2 = udd1!*0.868976
                    textField2.text = String(udd2)
                    }
                }
            
            // Novena medida Milla Náutica
            
            if (labelField1.text == "nmi") {
                if (labelField2.text == "mm") {
                    let udd2 = udd1!*1852000
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "cm") {
                    let udd2 = udd1!*185200
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "m") {
                    let udd2 = udd1!*1852
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "km") {
                    let udd2 = udd1!*1.852
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "yd") {
                    let udd2 = udd1!*2025.37
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "in") {
                    let udd2 = udd1!*72913.4
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "ft") {
                    let udd2 = udd1!*6076.12
                    textField2.text = String(udd2)
                    }
                if (labelField2.text == "mi") {
                    let udd2 = udd1!*1.15078
                    textField2.text = String(udd2)
                    }
                }
            else if (udd1 == nil) {
                textField2.text = "0"
                }
            }
        }
    
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let invalidCharacters = CharacterSet(charactersIn: ".0123456789").inverted
        return string.rangeOfCharacter(from: invalidCharacters, options: [], range: string.startIndex ..< string.endIndex) == nil
    }
    

    
    
    override func viewDidLoad() {
       
        super.viewDidLoad()
        pickerView1.delegate = self
        pickerView1.dataSource = self
        pickerView2.delegate = self
        pickerView2.dataSource = self
        textField1.delegate = self
        textField2.delegate = self
        textField1.keyboardType = .numberPad
        textField2.keyboardType = .numberPad
        
//********* IMPLEMENTAMOS UNA BARRA CON EL BOTON Done EN EL TECLADO DEL IPHONE ************
        
        let toolBar = UIToolbar()
        toolBar.sizeToFit()
        let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: #selector(self.doneClicked))
        
        toolBar.setItems([doneButton], animated: false)
        
        textField1.inputAccessoryView = toolBar
        textField2.inputAccessoryView = toolBar
    }

    @objc func doneClicked() {
        view.endEditing(true)
        }
//*********************************************************************



//********** FUNCIONES QUE DEFINEN A LOS PICKERVIEW **********
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int
    {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    {
        return distances[row]
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    {
        return distances.count
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        if pickerView == pickerView1
        {
            labelField1.text = abreviaturas[row]
        }
        else if pickerView == pickerView2
        {
            labelField2.text = abreviaturas[row]
        }
    }
//****************************************************
    
    
    
}

I know my code is long, but don't know yet how to manage Arrays.


Thanks for your help guys.

Accepted Answer

If I understand what you want, you should modify pickerView, to call for conversion at the end:


    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        if pickerView == pickerView1
        {
            labelField1.text = abreviaturas[row]
        }
        else if pickerView == pickerView2
        {
            labelField2.text = abreviaturas[row]
        }
     textField1EntryValue(textField1)     // As you do not use the sender, no matter which UITextField you pass as parameter
    }

or use an array to define conversions if you prefer:

The simplest would be to have a dictionariy:

let convertToMeter : [String: Double] = ["mm": 0.001, "cm": 0.01, "m": 1.0, "km": 1000, "yd": 0.9144, "in": 0.0254, "ft": 0.3048, "mi": 1609.34, "nmi": 1852.0]

Then whole conversion becomes:


@IBAction func textField1EntryValue(_ sender: UITextField) {
  
    var udd1 = Double(textField1.text!) ?? 0.0    // In case textField does not hold a Double
    var udd2 = Double(textField2.text!) ?? 0.0    // In case textField does not hold a Double
      
    let unit1 = labelField1.text     // ex: "cm"
    let unit2 = labelField2.text     // ex : "ft"
    guard let c1ToMeter = convertToMeter[unit1] else { return }    // 0.01.  check entry not nil
    guard let c2ToMeter = convertToMeter[unit2] else { return } 
    let c2FromMeter = 1 / c2ToMeter     // Inverse conversion = 1 / 0.3048
    udd2 = udd1 * c1ToMeter * c2FromMeter
    textField2.text = String(udd2)
}


Note: you should look at LengthFormatter.Unit, (example : h ttps://www.sitepoint.com/using-measurementformatter/. )


Note: in your code, you had redefined udd2 with the let statement

let udd2 = udd1!*0.1

It should work, but this is not a good practice, because you have already defined a var udd2.

You should have written simply

udd2 = udd1!*0.1



Note: Could you also close the other threads that you have left open in the forum, by marking the correct answer.

Many thanks.

Very helpfull.

TextField value change with PickerViews
 
 
Q