经过的计时器未启动
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 键并单击 seconds
和 tenOfSeconds
,您会发现一个是 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()
}
}
}
我正在构建一个经过的计时器,虽然代码没有给出错误,但计时器没有启动。
我正在使用两个 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 键并单击 seconds
和 tenOfSeconds
,您会发现一个是 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()
}
}
}