我的猜測是,你正試圖在init方法中訪問插座,或者在視圖加載之前設置了值時訪問器。有兩種方法來處理這種情況。
首先是推遲更新子視圖,直到知道視圖已加載。我通過從viewWillAppear()
調用updateView()
方法來完成此操作。我通常也會在變量發生變化時調用這個方法,所以我會在繼續之前測試以確保視圖已經加載。如果視圖不存在,設置視圖沒有任何價值。它看起來是這樣的:
class MyViewController: UIViewController {
var product: Product {
didSet {
updateView()
}
}
@IBOutlet private weak var productNameLabel: UILabel!
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
updateView()
}
private func updateView() {
guard isViewLoaded() else {
return
}
if let product = product {
productNameLabel.text = product.title
}
}
}
另一種選擇,這類似於你在做什麼,是迫使以期及早加載。我認爲這不太理想,但在某些情況下,這是正確的做法。但是在做它,你發現的方式,這樣做更有意這樣的:
class MyViewController: UIViewController {
var product: Product {
didSet {
loadViewIfNeeded()
productNameLabel.text = product.title
}
}
@IBOutlet private weak var productNameLabel: UILabel!
}
當你正在測試爲直營店,你期間或之後測試'viewDidLoad'叫? – ThomasW
@ThomasW我已經嘗試過和之後都是零。我剛剛重新創建了整個班級,現在我可以更改'viewDidLoad'中的值,但如果在此後隨時嘗試訪問它,則它是零。 – user14492
你是如何加載視圖控制器? – ThomasW