Search code examples
iosswiftxcodesegueuipickerview

Can not pass data to next ViewController depends on UIPickerView textField.text?


When I am selecting Target 2 in picker view all working good, the labels text on the next view controller are updating, all ok. But if I will select Target 1 - opening next ViewController without any errors but labels text is empty nil.

I will appreciate if you help me or sudgest other way. I am simply using if else statement to check textField.

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let resultsVC = segue.destination as! ResultsViewController

        var declinationDegr = Int()
        if (bodyTextField.text?.contains("Target 1"))! {
            declinationDegr = declinationDegreeTarget1
        } else if (bodyTextField.text?.contains("Target 2"))! {
            declinationDegr = declinationDegreeTarget2
        }
        var declinationMinutes = Double()
        if (bodyTextField.text?.contains("Target 1"))! {
            declinationMinutes = declinationMinutesTarget1
        } else if (bodyTextField.text?.contains("Target 2"))! {
            declinationMinutes = declinationMinutesTarget2
        }
        var declinationDir = String()
        if (bodyTextField.text?.contains("Target 1"))! {
            declinationDir = declinationDirTarget1
        } else if (bodyTextField.text?.contains("Target 2"))! {
            declinationDir = declinationDirTarget2

resultsVC.bdeclString = "\(declinationDegr)º\(String(format: "%.1f", declinationMinutes))'\(declinationDir)"
  }

Solution

  • First, I think you are missing the closing curly braces of the last if/else statement.

    var declinationDir = String()
    if (bodyTextField.text?.contains("Target 1"))! {
        declinationDir = declinationDirTarget1
    } else if (bodyTextField.text?.contains("Target 2"))! {
        declinationDir = declinationDirTarget2
    } // CLOSING BRACE MISSING 
    
    resultsVC.bdeclString = "\(declinationDegr)º\(String(format: "%.1f", declinationMinutes))'\(declinationDir)"
    

    Second, I would re-organize the code a litte, to avoid unnecessary string comparison and forced unwrapping:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let resultsVC = segue.destination as? ResultsViewController  else {
            // error handling and
            return
        }
        guard let targetText = bodyTextField.text else {
            // error handling and
            return
        }
    
        var declinationDegr = Int()
        var declinationMinutes = Double()
        var declinationDir = String()
    
        if (targetText.contains("Target 1")) {
            declinationDegr = declinationDegreeTarget1
            declinationMinutes = declinationMinutesTarget1
            declinationDir = declinationDirTarget1
        } else if (targetText.contains("Target 2")) {
            declinationDegr = declinationDegreeTarget2
            declinationMinutes = declinationMinutesTarget2
            declinationDir = declinationDirTarget2
        } else {
            // error handling
        }
    
        resultsVC.bdeclString = "\(declinationDegr)º\(String(format: "%.1f", declinationMinutes))'\(declinationDir)"
    }