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
功能。此时,您的插座将被初始化。通过将以下内容添加到myUIViewController
中进行修复:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive", name: UIApplicationDidBecomeActiveNotification, object: nil)
然后,当设备激活时,它执行didBecomeActive()
函数