首页 文章

在分配TO可选时,意外地发现了nil

提问于
浏览
0

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

当我尝试手动设置timerLabel.text =“”时,我在该行上得到相同的错误 . 这意味着警告涉及我分配的变量,而不是我分配的变量 .

其他标签也是如此(hoursLabel.text = time.hours等)

问题:为什么我分配的值是零是否重要?考虑到我在tableViewCell中使用类似的代码并且它工作正常,可能导致这种情况的原因是什么?我试图重建viewController并重新连接所有IBOutlets . 我已经清理了这个项目但仍然没有运气 .

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

    可能是一些原因

    • timerLabel未连接到storyboard中的任何标签 . 核实 .

    • 有时Xcode没有看到故事板中的变化 . 清理项目并再次构建它 .

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

    • 检查 viewDidLoad() 和其他覆盖的功能 . 也许你忘了添加超级电话 .

    添加更多代码 . 如何创建此控制器 . 你怎么称呼这个功能 .

  • 1

    问题可能在于您调用setTimer函数的位置 . 尝试在TimeControlVC的viewDidLoad中运行它,看看会发生什么 .

    在推送或呈现视图控制器之前不应该调用它(setTimer函数),因为视图尚未设置,因此它会因为无法找到要分配的视图而抛出nil错误而崩溃 .

  • 0

    timerLabel 可能是 nil ,并且试图访问它(隐式强制解包,因为它是一个隐式解包的可选项)以使其 text 导致崩溃 .

    最有可能的是,你有一个没有正确连接的 @IBOutlet .

相关问题