簡體   English   中英

斯威夫特物業觀察員和零

[英]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

  • isNewUsercanYouGuessLbl初始化之前被賦予一個新值(在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM