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

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

通过将以下内容添加到我的 UIViewController 来修复:

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

然后在设备激活时执行didBecomeActive()函数。