[英]Swift property observer and nil
我有一個必須修改iboutlet屬性的屬性觀察者代碼:
@IBOutlet weak var canYouGuessLbl: UILabel!
var isNewUser: Bool = false {
didSet {
if isNewUser {
canYouGuessLbl!.layer.zPosition = 5
canYouGuessLbl!.hidden = false
} else {
canYouGuessLbl!.hidden = true // Error at this line
}
}
}
這在運行時崩潰,因為canYouGuessLbl! 似乎是零:
fatal error: unexpectedly found nil while unwrapping an Optional value
我不確定原因以及如何解決這個問題。
如果您的問題出現在Antonio的答案的第一場景中,那么您可以通過將isNewUser變量聲明為可選來解決它,並在canYouGuessLbl完全初始化之后在viewDidLoad方法上為其賦值
var isNewUser: Bool! {
didSet(newValue) {
if isNewUser != nil && isNewUser! {
canYouGuessLbl!.layer.zPosition = 5
canYouGuessLbl!.hidden = false
} else if isNewUser != nil && !isNewUser! {
canYouGuessLbl!.hidden = true
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
isNewUser = false
}
有幾個原因canYouGuessLbl
可以分配一個新的值時,零isNewUser
:
isNewUser
在canYouGuessLbl
初始化之前被賦予一個新值(在viewDidLoad
之前,例如在初始化程序中)
尚未為canYouGuessLbl
定義canYouGuessLbl
(即接口生成器中的標簽控件尚未連接到屬性)
IB中的視圖控制器未連接到實現類(身份檢查器中的自定義類)
更新 - 在第一種情況下,您可以通過顯式檢查不是nil來修復:
var isNewUser: Bool = false {
didSet {
if canYouGuessLbl != nil {
if isNewUser {
canYouGuessLbl.layer.zPosition = 5
canYouGuessLbl.hidden = false
} else {
canYouGuessLbl.hidden = true // Error at this line
}
}
}
}
但是請注意,標簽不會更新(因為它還不存在)。 它只是防止異常。
附加說明:初始化屬性時,不會調用didSet
(更didSet
是屬性觀察者)。
謝謝你的答案。 它啟發了我這個解決方案:
我必須將動作放在一個單獨的函數中執行:
func ifNewUser() {
if isNewUser! {
canYouGuessLbl?.layer.zPosition = 5
canYouGuessLbl?.hidden = false
} else if !isNewUser! {
canYouGuessLbl?.layer.zPosition = 5
canYouGuessLbl?.hideAndDisable()
}
}
主要問題是初始化,所以首先我在viewDidLoad中檢查它:
ifNewUser()
因為bool值很早就會通過segue接收到它的值,所以在初始化包括IBoutlet在內的所有變量之后,首先在viewDidLoad中檢查它是合適的。
然后,當用戶不再被宣布為新用戶時,我保留了觀察者,但是調用了函數:
var isNewUser: Bool? {
didSet {
ifNewUser()
}
}
這份工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.