Search code examples
iosswiftstaticsegue

Why does the value of my variable revert in Swift?


I got my code working, but I don't know why it works.

Having this prepareForSegue Function doesn't work, and when my variable is called in the viewController that the prepareForSegue goes to, it returns nil.

The original VC:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == K.latinSegue {
        if latinTextField.text != nil && latinTextField.text != "" {
            guard let latinText = latinTextField.text else { fatalError("latinText broken")}
            let destinationVC = LatinViewController()
            destinationVC.latinText = latinText
            
        }
    }
}

The destinationVC:

var latinText: String?

@IBOutlet weak var textLabel: UILabel!

override func viewDidLoad() {
    let latinTranslator = LatinTranslator()
    let latinDefinition = latinTranslator.getHTMLAndDefinition(latinText: **latinText!**)
    textLabel.text = latinDefinition
}

latinText! Doesn't have a value when it is force unwrapped here, even though I set its value in the prepare for segue function.

Now, this code works. I kinda know how static variables work, so I'm just really confused as to why the previous code doesn't work - it throws a nil value not found error.

The originalVC:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == K.latinSegue {
        if latinTextField.text != nil && latinTextField.text != "" {
            guard let latinText = latinTextField.text else { fatalError("latinText broken")}
            LatinViewController.latinText = latinText
        }
    }
}

The destinationVC:

static var latinText: String!

@IBOutlet weak var textLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    let latinTranslator = LatinTranslator()
    let latinDefinition = latinTranslator.getHTMLAndDefinition(latinText: LatinViewController.latinText)
    textLabel.text = latinDefinition
}

The segue is called when a button is pressed. I have checked, there is only one segue. Please help!


Solution

  • The issue you’re having is that you’re creating a new instance of LatinViewController and not using the instance that your app will actually be navigating to.

    Instead of this:

    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == K.latinSegue {
            if latinTextField.text != nil && latinTextField.text != "" {
                guard let latinText = latinTextField.text else { fatalError("latinText broken")}
                let destinationVC = LatinViewController()
                destinationVC.latinText = latinText
                
            }
        }
    }
    

    You should be doing something like this:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       guard segue.identifier == K.latinSegue, let destination = segue.destination as? LatinViewController else {
          return
       }
       guard let text = latinTextField.text, !text.isEmpty else {
          return
       }
       destination.latinText = text
    }