我有一个必须修改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
我不确定原因以及如何解决这个问题。
答案 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
可能为零的原因有几个:
isNewUser
在canYouGuessLbl
初始化之前(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()
}
}
这份工作。