xcode有些奇怪。突然间,普通的流动被打破了。为了检查它,我创建了一个只有两个viewControllers的新项目。 First(名为ViewController)只包含一个按钮来打开第二个(名为NewViewController)控制器,它包含唯一的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()
}
}
But the debugger shows what the UILabel is nil
我做错了什么?
答案 0 :(得分:2)
不,没有任何“破碎”。你是那个做错了的人。当您致电newVC.passedText = "some abstract text"
时,newVC
尚未加载其观看次数且其出口仍为nil
。因此,当出口确实仍为myLabel.text
时,设置nil
的调用正在发生。
您的错误是您尝试过早配置myLabel
。将值存储在newVC
中,是的。但至于设置myLabel.text
,请等到viewDidLoad
,当视图和插座工作时。
因此,正确的模式如下所示:
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
}
现在,无论 passedText
与viewDidLoad
相关时,您的代码都是正确的。
答案 1 :(得分:0)
您需要在情节提要中的视图控制器的身份检查器中设置自定义类NewViewController
。也许你忘了那样做?