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!
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
}