簡體   English   中英

已用計時器未啟動

[英]Elapsed Timer not starting

我正在建立一個經過的計時器,而代碼沒有給出錯誤,則計時器無法啟動。

我正在使用兩個ViewController,一個叫做Stopwatch,它在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
}
}

調試窗口中什么都沒有,所以不確定是什么問題,我一遍又一遍地重新連接了按鈕,事實並非如此。 如上所述,我在代碼中也沒有得到其他錯誤。

任何人都可以闡明這一點。 也許我使用了錯誤的#selector或我在執行updateElapsedTimeLabel分鍾,秒,tenOfSeconds計算錯誤。 不確定。 感謝您的瀏覽。

如果在Option上單擊secondstenOfSeconds您會發現一個類型為TimeInterval (即Double ),另一個類型為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()
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM