经过的计时器无法启动

时间:2018-04-16 22:39:22

标签: ios swift stopwatch elapsedtime

我正在构建一个经过时间的计时器,而代码没有错误,计时器无法启动。

我正在使用两个ViewControllers,一个名为Stopwatch,它在Stopwatch()类下面有一个启动停止功能,然后是一个常规的ViewController,其余的都在其中。

Main Storyboard Button and Outlet Connections

查看控制器代码:

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
}
}

调试窗口中根本没有任何内容,所以不确定问题是什么,我一遍又一遍地重新连接按钮,所以不是这样。我也没有在上面提到的代码中得到任何其他错误。

任何人都可以对此有所了解。也许我使用了错误的#selector或者我正在执行updateElapsedTimeLabel分钟,秒,十分之一秒计算错误。不确定。谢谢你看看。

1 个答案:

答案 0 :(得分:1)

如果您按住Option键并单击secondstenOfSeconds,您会发现其中一个类型为TimeInterval(即Double),另一个类型为{{1} }}。所以Double的格式说明符错了。在C中,格式说明符和参数之间的不匹配是未定义的行为。斯威夫特并没有说它是如何处理的,但我想它会忽略这个论点。

要解决此问题,请将最后2个组件的格式说明符更改为%02d

%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