如何让NSTimer显示Hrs:Min:Sec

时间:2015-08-19 22:46:44

标签: ios swift nstimer

我试图让计时器显示以下内容 - 小时:分钟:秒:毫秒。我找到了一个网站教程,展示了如何做到这一点,但它没有显示时间。这是网站: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()函数中发生了什么。我不知道它如何将自己转化为min,secs ......如果有人能给我一个解释,我会非常感激。

我的目标是增加时间,但我也想完全了解最新情况。

2 个答案:

答案 0 :(得分:3)

我会一步一步地指导你做什么。

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

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。

我希望这能澄清事情。

答案 1 :(得分:2)

试试这个:

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

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 strHours = String(format: "%02d", hours)
    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)

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

elapsedTime以秒为单位,例如elapsedTime = 5000 seconds。一小时有3600秒,所以你将它除以3600,将其向下舍入到最接近的小时。现在hours = 1。然后你减去3600秒:elapsedTime = 1400。然后将它除以60,向下舍入得到分钟(minutes = 23)。然后再次减去以获得秒elapsedTime = 1400 - 23 * 60 = 20 seconds