问题
there is something strange with xcode. Suddenly the ordinary flow is broken. To check it I've created a new project with just two viewControllers. First (named ViewController) contains only one button to open the second (named NewViewController) controller, which contains the only UILabel.
import UIKit
class ViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "Show New View" {
guard let newVC = segue.destination as? NewViewController else { return }
newVC.passedText = "some abstract text"
}
}
}
import UIKit
class NewViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
var passedText: String? {
didSet {
guard let text = passedText else { return }
myLabel.text = text
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
the main.storyboard looks so
IBOutlet is well connected
But the debugger shows what the UILabel is nil
What I've made wrong?
回答1:
No, nothing has "broken". You're the one who is doing it wrong. At the time you are calling newVC.passedText = "some abstract text", newVC has not yet loaded its view and its outlets are still nil. So the call to set myLabel.text is happening at time when the outlet is indeed still nil.
Your mistake is that you are trying to configure myLabel too soon. Store the value in newVC, yes. But as for setting myLabel.text, wait until viewDidLoad, when the view and outlets are working.
The correct pattern, therefore, looks like this:
var passedText: String? {
didSet {
guard let text = passedText else { return }
myLabel?.text = text
}
}
override func viewDidLoad() {
super.viewDidLoad()
guard let text = passedText else { return }
myLabel?.text = text
}
Now your code does the right thing regardless of when passedText is set in relation to viewDidLoad.
回答2:
You need to set the custom class NewViewController in the identity inspector of the view controller in the storyboard. Maybe you forgot to do that?
来源:https://stackoverflow.com/questions/48671671/iboutlet-is-not-initialized