【问题标题】:Unexpectedly found nil while assigning TO an optional分配给可选时意外发现 nil
【发布时间】: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

标签: ios iphone swift uilabel


【解决方案1】:

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

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

【讨论】:

  • 你和@vacawama 走在了正确的轨道上。我更改了代码以将视图控制器呈现为 self.present(TCVC, animated: true, completion: nil)
  • 然后我从之前的视图控制器中调用了 setTimer 函数。谢谢!我以为只要你创建了一个实例,它就应该可以工作。
  • 不错,没问题。很高兴能帮上忙! @AJL001
【解决方案2】:

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

很可能,您有一个未正确连接的@IBOutlet

【讨论】:

  • 这是我在重建视图控制器时特别小心避免的。我只是再次检查:所有插座都已连接。无论如何,这会产生不同的错误。
  • @AJL001 timerLabel 打印或在配音器中检查时的值是多少?
  • 这根本不是@IBOutlets,虽然我理解你为什么会这样想。这是我在调用 setTimer 函数之前没有展示视图控制器。显然,仅实例化 VC 是不够的。您还必须在调用其方法之前呈现它。
【解决方案3】:

可能是一些原因

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

  2. 有时 Xcode 看不到情节提要中的变化。清理项目并重新构建它。

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

  4. 检查您的viewDidLoad() 和其他被覆盖的函数。可能你忘记添加超级调用了。

添加更多代码。如何创建此控制器。你怎么称呼这个函数。

【讨论】:

    最近更新 更多