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

标签 swift uilabel

我对 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 属性的好地方是 mainViewControllerviewDidLoad 函数。此时您的导出将被初始化。

关于swift - 在 didBecomeActive() 中展开可选值时为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016699/

相关文章:

ios - Apple 建议使用 : custom struct or extension? 是什么

swift - 使用按钮更改背景图像

ios - <b> 标记在 UILabel 属性字符串中不起作用

ios - UILabel 周围的两条水平线

ios - 为什么在完成 block 中更改 .text 字段时 UITextField 和 UILabel 不更新?

构建时 Swift 编译器段错误

ios - 使用自动布局 Xcode 居中

iphone - 多个 UILabel 实例

ios - 自定义安装的字体在 UILabel 中未正确显示

ios - iOS Swift 上的 FFMpeg