线程1:致命错误:意外地发现nil,同时隐式展开了一个可选值[duplicate]

问题描述 投票:-1回答:1

我的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

        }
    }
swift fatal-error guard
1个回答
-1
投票

问题可能是您设置page时尚未将插座连接起来,并且如果这些插座是隐式解包的可选选项(类型名称后为!,例如UILabel!),则会导致您描述的错误。例如,如果您在出现问题的视图控制器并且连接了所有插座之前设置了page,则此问题就会显现出来。

所以,我建议:

  1. @IBOutlet引用一起使用可选的链接,因此,如果尚未连接插座,它也不会失败。

  2. [如果需要,请继续将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观察者。

© www.soinside.com 2019 - 2024. All rights reserved.