我的Swift程序崩溃时出现致命错误,说即使使用GUARD语句,“在意外地发现nil时却隐式展开了一个Optional值”。谁能告诉我原因,以及如何解决?代码如下:
var page: Page? {
didSet{
guard let unwrappedPage = page else { return }
NameLabel.text = unwrappedPage.dishName
Image.image = UIImage(named: unwrappedPage.imageName)
contentText.text = unwrappedPage.ingredient
contentText.text = unwrappedPage.instruction
}
}
问题可能是您设置page
时尚未将插座连接起来,并且如果这些插座是隐式解包的可选选项(类型名称后为!
,例如UILabel!
),则会导致您描述的错误。例如,如果您在出现问题的视图控制器并且连接了所有插座之前设置了page
,则此问题就会显现出来。
所以,我建议:
与@IBOutlet
引用一起使用可选的链接,因此,如果尚未连接插座,它也不会失败。
[如果需要,请继续将didSet
观察者保留在page
上,但请确保在连接出口之前设置viewDidLoad
的情况下,也要更新page
中的控件。
例如:
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var imageView: UILabel!
@IBOutlet weak var ingredientLabel: UILabel!
@IBOutlet weak var instructionLabel: UILabel!
var page: Page? { didSet { updateControls(for: page) } }
override func viewDidLoad() {
super.viewDidLoad()
updateControls(for: page)
}
func updateControls(for page: Page?) {
nameLabel?.text = page?.dishName
imageView?.image = page.flatMap { UIImage(named: $0) }
ingredientLabel?.text = page?.ingredient
instructionLabel?.text = page?.instruction
}
注意,如果在显示视图后可能再次设置了didSet
,则仅需要此page
观察者。如果不是,则不需要didSet
观察者。