在 didBecomeActive() 中展开可选值时为零
Nil when unwrapping an Optional Value in didBecomeActive()
我对 UIViewController
中的以下情况感到非常困惑:
我有以下 @IBOutlet
,它在我的情节提要中有一个引用插座。
class MainViewController: UIViewController {
@IBOutlet weak var warningLabel: UILabel!
}
然后我的 AppDelegate
:
var mainViewController: BLEMainViewController?
func applicationDidBecomeActive(application: UIApplication) {
let mainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("mainViewController") as MainViewController
let viewController = UINavigationController(rootViewController: mainViewController)
mainViewController.didBecomeActive()
}
当我在里面设置这个的时候didBecomeActive()
self.warningLabel.text = "something"
我收到以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
但是,如果我在内部执行以下操作,它会工作正常:
override func viewWillAppear(animated: Bool) {
self.warningLabel.text = "something"
}
如果我这样做 warningLabel.text = "something"
我会得到同样的错误。
如果我这样做 warningLabel?.text = "something"
它实际上并没有得到设置。
如果我这样做 self.warningLabel?.text = "something"
它实际上并没有得到设置。
我究竟做错了什么?
编辑:
通过将以下内容添加到我的 UIViewController
来修复:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
然后在设备激活时执行didBecomeActive()
函数。
您的 IBOutlet
尚未在 applicationDidBecomeActive
结束时初始化。因此,您正在尝试访问未初始化对象的 属性 (.text
)。这会导致错误。
调用 warningLabel?.text = "something"
时没有任何错误,因为 ?
意味着只有在 warningLabel
时才想访问 .text
属性已初始化(不同于 nil
)。这也解释了为什么在这种情况下没有设置文本。
初始化插座 属性 的好地方是 mainViewController
的 viewDidLoad
函数。此时您的出口将被初始化。
通过将以下内容添加到我的 UIViewController
来修复:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
然后在设备激活时执行didBecomeActive()
函数。
我对 UIViewController
中的以下情况感到非常困惑:
我有以下 @IBOutlet
,它在我的情节提要中有一个引用插座。
class MainViewController: UIViewController {
@IBOutlet weak var warningLabel: UILabel!
}
然后我的 AppDelegate
:
var mainViewController: BLEMainViewController?
func applicationDidBecomeActive(application: UIApplication) {
let mainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("mainViewController") as MainViewController
let viewController = UINavigationController(rootViewController: mainViewController)
mainViewController.didBecomeActive()
}
当我在里面设置这个的时候didBecomeActive()
self.warningLabel.text = "something"
我收到以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
但是,如果我在内部执行以下操作,它会工作正常:
override func viewWillAppear(animated: Bool) {
self.warningLabel.text = "something"
}
如果我这样做 warningLabel.text = "something"
我会得到同样的错误。
如果我这样做 warningLabel?.text = "something"
它实际上并没有得到设置。
如果我这样做 self.warningLabel?.text = "something"
它实际上并没有得到设置。
我究竟做错了什么?
编辑:
通过将以下内容添加到我的 UIViewController
来修复:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
然后在设备激活时执行didBecomeActive()
函数。
您的 IBOutlet
尚未在 applicationDidBecomeActive
结束时初始化。因此,您正在尝试访问未初始化对象的 属性 (.text
)。这会导致错误。
调用 warningLabel?.text = "something"
时没有任何错误,因为 ?
意味着只有在 warningLabel
时才想访问 .text
属性已初始化(不同于 nil
)。这也解释了为什么在这种情况下没有设置文本。
初始化插座 属性 的好地方是 mainViewController
的 viewDidLoad
函数。此时您的出口将被初始化。
通过将以下内容添加到我的 UIViewController
来修复:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
然后在设备激活时执行didBecomeActive()
函数。