在 didBecomeActive() 中解开可选值时为 Nil



我对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 )。这也解释了为什么在这种情况下没有设置文本。

初始化插座属性的好地方是mainViewControllerviewDidLoad函数。此时,您的出口将被初始化。

通过在我UIViewController中添加以下内容来修复:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)

然后,当设备变为活动状态时,它会执行didBecomeActive()函数。

最新更新