我对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()
函数。