如何在Swift中创建一个带有分钟和秒的倒计时器?

4

我找不到一个可以实现分钟和秒的倒计时器的教程。虽然有一两个,但它们并不是很好。

import UIKit

class HomeViewController: UIViewController {
    @IBOutlet weak var focusSession: UILabel!
    @IBOutlet weak var breakSession: UILabel!

    var prodSeconds = String() // This value is set in a different view controller
    lazy var intProdSeconds = Int(prodSeconds)
    var timer = Timer()
    var isTimerRunning = false  // Make sure only one timer is running at a time

    override func viewDidLoad() {
        super.viewDidLoad()

        if isTimerRunning == false {
            runProdTimer()
        }

        //focusSession.text = String(prodMinutes) + ":" + String(prodSeconds) // Ignore this for now stack overflow ppl
    }

    func runProdTimer() {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(HomeViewController.updateProdTimer)), userInfo: nil, repeats: true)
        isTimerRunning = true
    }

    @objc func updateProdTimer() {
        if intProdSeconds! < 1 {
            timer.invalidate()
            focusSession.text = "00:00"
        }
        else {
            intProdSeconds! -= 1
            focusSession.text = prodTimeString(time: TimeInterval(prodSeconds)!)
        }
    }

    func prodTimeString(time: TimeInterval) -> String {
        let prodMinutes = Int(time) / 60 % 60
        let prodSeconds = Int(time) % 60

        return String(format: "%02d:%02d", prodMinutes, prodSeconds)
    }
}

用户输入了时间数量并存储在prodSeconds变量中,然后使用lazy变量将其转换为下面的Int
然而,在运行应用程序时计时器仍然不会倒数。这只是一个秒倒计时器,我是从另一个教程中学来的。但是,所有发生的事情就是显示计时器的标签以00:prodSeconds的格式显示用户输入的数字,并且实际上不会倒计时。
P.S.暂时不要担心实现启动/停止按钮。在我的情况下,计时器应该在视图加载时启动。

你的问题不够清晰。你的 prodTimeString 函数运行良好。传入 90,你会得到 01:30 - rmaddy
1
你可能想避免每秒简单地减去1;Timer不是非常准确的。我建议你计算对应于你的结束时间的Date,然后使用timeIntervalSinceNow来计算剩余时间。此外,以小于一秒的速度运行你的计时器,比如0.5秒,以避免倒计时中的抖动。 - Paulw11
@rmaddy 好的,我现在明白了...但问题是,用户将输入分钟而不是秒...现在,无论输入什么都被读取为秒而不是分钟...我该如何让用户输入的分钟被视为分钟并转换为秒? - YungGoat
乘以60。 - rmaddy
@rmaddy 不用在意,我已经搞定了,哈哈...非常感谢! - YungGoat
1个回答

3
问题在于你从某个数字开始倒计时。
intProdSeconds! -= 1

并将 prodSeconds 传递给此函数。

focusSession.text = prodTimeString(time: TimeInterval(prodSeconds)!)

所以请确保只处理intProdSeconds


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接