ios - 经过计时器未启动

标签 ios swift stopwatch elapsedtime

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

我使用两个 ViewController,一个称为 Stopwatch,它在 Stopwatch() 类下具有启动停止功能,然后是一个常规 ViewController,其中包含其余部分。

Main Storyboard Button and Outlet Connections

查看 Controller 代码:

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

秒 TableView Controller 代码:

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 分钟、秒、tenOfSeconds 计算。没有把握。感谢您的浏览。

最佳答案

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

要修复此问题,请将最后 2 个组件的格式说明符更改为 %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()
        }
    }
}

关于ios - 经过计时器未启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49867267/

相关文章:

ios - 隐藏该单元格中的标签后,如何缩小表格 View 中行的大小?

ios - SpriteKit 正确处理声音

ios - Ionic 3 - 你的应用程序包含非公开的 api 使用

ios - 如何像设置应用程序一样使用表格 View 单元格编辑文本?

delphi - Delphi秒表时间格式

javascript - 在秒表上按 "stop"后如何停止时间运行

iphone - IOS6 怎样听界面方向。不是设备方向

ios - Swift - ScrollView 小于主视图

swift - 如何在 SpriteKit 中创建图像节点? swift 4

java - 跟踪当前TimeMillis