我对 UIViewController
中的以下场景感到非常困惑:
我有以下 @IBOutlet
,它在我的 Storyboard 中有一个引用 socket 。
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 :在展开可选值时意外发现 nil
但是,如果我在内部执行以下操作,它会工作正常:
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"
时没有任何错误,因为 ?
意味着您要访问 .text
属性仅当 warningLabel
被初始化时(不同于 nil
)。这也解释了为什么在这种情况下没有设置文本。
初始化 outlet 属性的好地方是 mainViewController
的 viewDidLoad
函数。此时您的导出将被初始化。
关于swift - 在 didBecomeActive() 中展开可选值时为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016699/