为什么这个 Swift 计时器没有触发?

Why is this Swift Timer not firing?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

@IBOutlet weak var Time: UILabel!

let everyMinuteTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true)

@objc func updateTime() {

    let currentDateTime = Date()

    let formatter = DateFormatter()
    formatter.timeStyle = .medium
    formatter.dateStyle = .long

    let dateTimeString = formatter.string(from: currentDateTime)

    Time.text = dateTimeString
}

我试图让这个计时器触发以更新时间标签,但它似乎没有触发并保持文本静态。

这是我不断收到的错误:

'unrecognized selector sent to instance 0x600000faed90'

问题是您的代码应该在一个方法中。当你初始化定时器 属性 时没有 self。你有两个选择。

  1. 将您的计时器声明为 lazy var

  2. 通常将您的计时器声明移动到任何视图控制器方法 viewDidLoad

请注意,我还会更改您的计时器间隔频率。每秒 100 次太多了。如果您只需要在分钟更改时触发您的方法,您可以安排计时器在下一个偶数分钟开始并每分钟重复一次。

这个问题是一个棘手的问题,涉及self的含义。变化

override func viewDidLoad() {
    super.viewDidLoad()
}

let everyMinuteTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true)

override func viewDidLoad() {
    super.viewDidLoad()
    self.everyMinuteTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true)
}

var everyMinuteTimer : Timer!

我知道这看起来不可思议,但这会解决问题。