分配给可选对象时意外发现nil

时间:2018-07-27 00:15:12

标签: ios iphone swift uilabel

在下面的代码中,在func setTimer(timer:Timer)中,我将timer.timeLabel分配给timerLabel.text。当我运行该代码时,它给我一个错误,说“线程1:致命错误:在展开一个Optional值时意外地发现nil”。我确定它不是在引用timer.timerlabel,因为我可以运行print(timer.timerlabel)并输出字符串。因此,该值不为零。

当我尝试手动设置timerLabel.text =“”时,在该行上出现了相同的错误。这意味着警告与我分配给的变量有关,而不与我分配给的变量有关。

其他标签也发生了同样的事情(hoursLabel.text = time.hours等)

问题:为什么我要分配的值为nil怎么办?考虑到我在tableViewCell中使用了类似的代码并且工作正常,这可能是什么导致的?我试图重建viewController并重新连接所有IBOutlet。我已经清理了项目,但仍然没有运气。

import UIKit

class TimerControlVC: UIViewController {

@IBOutlet weak var timerLabel: UILabel!

@IBOutlet weak var hoursLabel: UILabel!

@IBOutlet weak var minutesLabel: UILabel!

@IBOutlet weak var secondsLabel: UILabel!

let tf = TimeFormatter()

func setTimer(timer: Timer){

    print(timer.timerLabel)

    timerLabel.text = timer.timerLabel
    let time = tf.formatOutput(seconds: timer.time)
    hoursLabel.text = time.hours
    minutesLabel.text = time.minutes
    secondsLabel.text = time.seconds

  }

}

3 个答案:

答案 0 :(得分:1)

timerLabel可能是nil,并且尝试访问它(隐式强制展开,因为它是一个隐式展开的可选内容)以获取其text导致崩溃。

很可能您的@IBOutlet没有正确连接。

答案 1 :(得分:0)

问题可能出在调用setTimer函数的地方。 尝试在TimeControlVC的viewDidLoad中运行它,看看会发生什么。

在推送或展示视图控制器之前,不应调用它(setTimer函数),因为尚未设置视图,因此由于抛出nil错误而导致崩溃,因为他们找不到要分配给的视图

答案 2 :(得分:0)

可能是某些原因

  1. timerLabel未连接到情节提要中的任何标签。检查一下。

  2. 有时Xcode看不到情节提要中的更改。清理项目,然后重新构建。

  3. 在创建所有视图之前调用此方法。例如,如果您从init()函数调用它。您应该在viewDidLoad()中配置UI。

  4. 检查您的viewDidLoad()和其他替代功能。也许您忘记添加超级通话。

添加更多代码。您如何创建此控制器。您如何称呼此功能?