经过的计时器未启动

Elapsed Timer not starting

我正在构建一个经过的计时器,虽然代码没有给出错误,但计时器没有启动。

我正在使用两个 ViewControllers,一个叫做 Stopwatch,它在 class Stopwatch() 下有开始停止功能,然后是一个常规的 ViewController,其余的在它。

查看控制器代码:

import UIKit

class ViewController: UIViewController {

let watch = Stopwatch()

@IBOutlet weak var elapsedTimeLabel: UILabel!

@IBAction func startButton(_ sender: Any) {
    Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.updateElapsedTimeLabel), userInfo: nil, repeats: true)

    watch.start()
}

@IBAction func stopButton(_ sender: Any) {
    watch.stop()
}

@objc func updateElapsedTimeLabel (timer : Timer) {
    if watch.isRunning {
        let minutes = Int (watch.elapsedTime/60)
        let seconds = watch.elapsedTime.truncatingRemainder(dividingBy: 60)
        let tenOfSeconds = (watch.elapsedTime * 10).truncatingRemainder(dividingBy: 10)
        elapsedTimeLabel.text = String (format: "%02d:%02d:%02d", minutes, seconds, tenOfSeconds)
    } else {
        timer.invalidate()
    }
}

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

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

override var prefersStatusBarHidden: Bool {
    return true
}
}

秒表视图控制器代码:

import Foundation

class Stopwatch {

private var startTime : Date?

var elapsedTime: TimeInterval {
    if let startTime = self.startTime {
        return -startTime.timeIntervalSinceNow
    } else {
        return 0
    }
}
var isRunning: Bool {
    return startTime != nil
}

func start() {
    startTime = Date()
}

func stop() {
    startTime = nil
}
}

调试 window 中什么也没有,所以不确定是什么问题,我一遍又一遍地重新连接按钮,所以不是那个问题。如上所述,我在代码中也没有其他错误。

任何人都可以阐明这一点。也许我使用了错误的#selector,或者我在做 updateElapsedTimeLabel 分、秒、tenOfSeconds 计算时出错了。不确定。感谢观看。

如果您按住 Option 键并单击 secondstenOfSeconds,您会发现一个是 TimeInterval 类型(即 Double),另一个是 Double。所以你的 %02d 格式说明符是错误的。在 C 中,格式说明符和参数之间的不匹配是未定义的行为。 Swift 没有说明它是如何处理的,但我猜它会忽略这个参数。

要修复它,请将最后两个组件的格式说明符更改为 %02.f:

let minutes = Int(watch.elapsedTime/60)
let seconds = watch.elapsedTime.truncatingRemainder(dividingBy: 60)
let tenOfSeconds = (watch.elapsedTime * 100).truncatingRemainder(dividingBy: 100) // fixed the math here
elapsedTimeLabel.text = String(format: "%02d:%02.f:%02.f", minutes, seconds, tenOfSeconds)

但为什么不用 DateFormatter 让您的生活更简单:

class ViewController: UIViewController {
    private let formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "mm:ss:SS"
        return formatter
    }()

    @objc func updateElapsedTimeLabel (timer : Timer) {
        if watch.isRunning {
            elapsedTimeLabel.text = formatter.string(from: Date(timeIntervalSince1970: watch.elapsedTime))
        } else {
            timer.invalidate()
        }
    }
}