在下面的代码中,在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 回答
可能是一些原因
timerLabel未连接到storyboard中的任何标签 . 核实 .
有时Xcode没有看到故事板中的变化 . 清理项目并再次构建它 .
在创建所有视图之前调用此方法 . 例如,如果您从
init()
函数调用它 . 您应该在viewDidLoad()
中配置UI .检查
viewDidLoad()
和其他覆盖的功能 . 也许你忘了添加超级电话 .添加更多代码 . 如何创建此控制器 . 你怎么称呼这个功能 .
问题可能在于您调用setTimer函数的位置 . 尝试在TimeControlVC的viewDidLoad中运行它,看看会发生什么 .
在推送或呈现视图控制器之前不应该调用它(setTimer函数),因为视图尚未设置,因此它会因为无法找到要分配的视图而抛出nil错误而崩溃 .
timerLabel
可能是nil
,并且试图访问它(隐式强制解包,因为它是一个隐式解包的可选项)以使其text
导致崩溃 .最有可能的是,你有一个没有正确连接的
@IBOutlet
.