Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在didBecomeActive()中展开可选值时为零_Swift_Uilabel - Fatal编程技术网

Swift 在didBecomeActive()中展开可选值时为零

Swift 在didBecomeActive()中展开可选值时为零,swift,uilabel,Swift,Uilabel,我对我的UIViewController中的以下场景感到非常困惑: NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "didB

我对我的
UIViewController
中的以下场景感到非常困惑:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
我有以下
@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”

我得到以下错误:

致命错误:在展开可选值时意外发现nil

但是,如果我在内部执行以下操作,则效果良好:

override func viewWillAppear(animated: Bool) {
    self.warningLabel.text = "something"
}
如果我做了
warningLabel.text=“something”
我会得到同样的错误

如果我做了
warningLabel?.text=“something”
它实际上不会被设置

如果我做了self.warningLabel?.text=“something”
它实际上没有被设置

我到底做错了什么

编辑:


通过将以下内容添加到my
UIViewController
中修复:

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

然后,当设备处于活动状态时,它执行
didBecomeActive()
功能。

您的
IBOutlet
尚未在
应用程序的末尾初始化。因此,您试图访问未初始化的对象的属性(
.text
)。这会导致错误

调用
warningLabel?.text=“something”
时没有任何错误,因为
表示只有在
warningLabel
初始化时(与
nil
不同),您才想访问
.text
属性。这也解释了为什么在这种情况下不设置文本


初始化outlet属性的好地方是
mainViewController
viewDidLoad
功能。此时,您的插座将被初始化。

通过将以下内容添加到my
UIViewController
中进行修复:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
然后,当设备激活时,它执行
didBecomeActive()
函数