我正在尝试让计时器显示以下内容 - 小时:分钟:秒:毫秒。我找到了一个网站教程,展示了如何做,但它没有显示小时数。这是网站:Simple-stopwatch

这是它所说的代码:

var timer = NSTimer()
var startTime = NSTimeInterval()

func updateTime()
{
    var currentTime = NSDate.timeIntervalSinceReferenceDate()
    var elapsedTime : NSTimeInterval = currentTime - startTime

    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)

    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)

    let fraction = UInt8(elapsedTime * 100)

    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)

    timeLabel.text = "\(strMinutes):\(strSeconds):\(strFraction)"
}

@IBAction func start(sender: AnyObject) {
    if !timer.valid {
        let aSelector : Selector = “updateTime”
        timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
        startTime = NSDate.timeIntervalSinceReferenceDate()
    }
}

@IBAction func stop(sender: AnyObject) {
    timer.invalidate()
}

我不完全理解 updateTime() 函数中发生了什么。我不明白它是如何将自己转换为分钟,秒......如果有人能给我一个解释,我将不胜感激。

我的目标是增加时间,但我也想完全了解发生了什么。

最佳答案

我将逐步指导您完成您需要做的事情。

前几行提取从当前时间到初始时间以秒为单位测量的时间间隔:

var currentTime = NSDate.timeIntervalSinceReferenceDate()
var elapsedTime : NSTimeInterval = currentTime - startTime

我认为这些线条是显而易见的。接下来,您要计算已经过去了多少小时。

为此,您需要添加:
let hours = UInt8(elapsedTime / 3600.0)

此行有效,因为 elapsedTime 以秒为单位。一小时有3600秒。当您将 elapsedTime 除以 3600 时,您会得到小时数。然而,这个数字可以是小数。例如,半小时对应 1800 秒,如果将 1800 除以 3600,则得到 0.5。您需要将其四舍五入以获得 0。为此您使用 UInt8() 构造函数。它将数字四舍五入到最小的整数。在我的示例中 UInt8(0.5) 等于零。

然后对其他组件使用相同的逻辑,注意一分钟有 60 秒(这就是为什么要除以 60)。

在这些调用之间减少 elapsedTime 的值:
elapsedTime -= (NSTimeInterval(hours) * 3600)

因为您需要从 elapsedTime 中删除与小时数相对应的秒数。否则,当您开始计算分钟数时,您最终会计算出更大的金额。例如,如果 elapsedTime 等于 3660(1 小时 1 分钟),除非您减去 3600,否则您将得到 61 分钟。

总体而言,对于您的应用程序,该函数如下所示:
func updateTime()
{
    var currentTime = NSDate.timeIntervalSinceReferenceDate()
    var elapsedTime : NSTimeInterval = currentTime - startTime

    let hours = UInt8(elapsedTime / 3600.0)
    elapsedTime -= (NSTimeInterval(hours) * 3600)

    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)

    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)

    let fraction = UInt8(elapsedTime * 100)

    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)

    timeLabel.text = "\(strMinutes):\(strSeconds):\(strFraction)"
}

关于为什么扣除时间很重要的更多信息

假设您的 elapsedTime 等于 3660 秒,即 1 小时 1 分钟。

线路:
let hours = UInt8(elapsedTime / 3600.0)

将正确计算小时数为 1。下一行:
elapsedTime -= (NSTimeInterval(hours) * 3600)

elapsedTime 的值中减去 1*3600 使其等于 60。这样做是删除那些不应用于计算分钟数的秒,因为它们已经用小时表示。

假设你不这样做,你要排队:
let minutes = UInt8(elapsedTime / 60.0)

如果您的 elapsedTime 仍然等于 3660,这一行将使 minutes 等于 61。您显然不希望那样!

但是,如果确实减去小时数,elapsedTime 等于 60,上面的行将使分钟数等于 1。输出将是 01:01 而不是 01:61。

我希望这能澄清事情。

关于ios - 如何让 NSTimer 显示 Hrs : Min : Sec,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32106856/

10-10 21:03