【发布时间】:2026-01-08 02:00:01
【问题描述】:
在下面的代码中,在 func setTimer(timer:Timer) 中,我将 timer.timeLabel 分配给 timerLabel.text。当我运行该代码时,它给了我一个错误,说“线程 1:致命错误:在展开可选值时意外发现 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
}
}
【问题讨论】:
-
timerLabel可能是nil,并试图访问它(隐式强制解包,因为它是一个隐式解包的可选)以获取其text导致崩溃。 -
如何创建
TimerControlVC的实例?你什么时候打电话给setTimer()? -
@vacawama 在我原来的视图控制器中:让 TCVC = Storyboard.instantiateViewController(withIdentifier: "timer_control") as! TimerControlVC)
-
在视图加载之前,出口仍然是
nil,当您推送或呈现TCVC时会发生这种情况。 -
在
TimerControlVC中覆盖viewDidLoad()并添加print("view loaded")。您是否在加载视图之前调用setTimer()?如果是这样,@IBOutlets 仍将是nil。