斯威夫特物业观察员和零

时间:2015-02-09 10:39:17

标签: ios swift

我有一个必须修改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

我不确定原因以及如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

如果您的问题出现在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
}

答案 1 :(得分:1)

在为canYouGuessLbl分配新值时,isNewUser可能为零的原因有几个:

  • isNewUsercanYouGuessLbl初始化之前(viewDidLoad之前)(例如在初始化程序中)分配了新值

  • 尚未为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(更常见的是属性观察者)。

答案 2 :(得分:0)

感谢您的回答。它激发了我对这个解决方案的启发:

我必须在单独的函数中执行操作:

    func ifNewUser() {
    if isNewUser! {
        canYouGuessLbl?.layer.zPosition = 5
        canYouGuessLbl?.hidden = false
    } else if !isNewUser! {
        canYouGuessLbl?.layer.zPosition = 5
        canYouGuessLbl?.hideAndDisable()
    }
}

主要问题是初始化,所以首先我在viewDidLoad中检查它:

ifNewUser()

因为bool值很早就会通过segue得到它的值,所以在初始化包括IBoutlets在内的所有变量之后,首先在viewDidLoad中检查它是否合适。

然后,当用户不再被宣布为新用户时,我保留了观察者,但是调用了函数:

    var isNewUser: Bool? {
    didSet {
        ifNewUser()
        }
    } 

这份工作。