2014-11-02 217 views
0

对不起,如果这听起来像一个菜鸟问题。我正在为iPhone构建一个秒表应用程序。标签显示hh:mm:ss。秒正确重置为0,当他们从0到60,并重新开始,但高于60分钟去下面的代码:在秒表中超过60分钟

var elapsedTime = NSTimeInterval() 

@IBAction func buttonAction(sender: AnyObject) 
{ 
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "fireStopWatch", userInfo: nil, repeats: true) 
    startTime = NSDate(timeIntervalSinceNow: 0) 

} 

func fireStopWatch() 
    { 
    var currentTime:NSDate = NSDate(timeIntervalSinceNow: 0) 
    elapsedTime = currentTime.timeIntervalSinceDate(startTime) 



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

    let strHours = hours > 9 ? String(hours):"0" + String(hours) 
    let strMinutes = minutes > 9 ? String(minutes):"0" + String(minutes) 
    let strSeconds = seconds > 9 ? String(seconds):"0" + String(seconds) 


    displayTimeLabel.text = "\(strHours):\(strMinutes)" 
    displaySecondsLabel.text = "\(strSeconds)" 



} 

什么与不与分发生的秒发生了什么?

回答

1

移动分钟以上的时间,因此被减去(就像你怎么有上面秒分钟)

let hours = UInt8(elapsedTime/3600.0) 
elapsedTime -= (NSTimeInterval(hours) * 3600) 
let minutes = UInt8(elapsedTime/60) 
elapsedTime -= (NSTimeInterval(minutes) * 60) 
let seconds = UInt8(elapsedTime) 
elapsedTime -= NSTimeInterval(seconds) 
+1

我不知道为什么这个答案被拒绝投票(也许选民可以发表评论)。我更喜欢整数算术,以避免任何浮点精度问题,但我不认为这将是一个问题,在这种特殊情况下。 – 2014-11-02 19:09:23

2

你行

let minutes = UInt8(elapsedTime/60) 

计算分钟的总数,而不是“一小时内”的分钟数。 您可以稍后通过减去60 * hours来解决该问题。

但我发现很容易开始与最低的单位(秒),然后计算出更高 单位(分钟,小时,...)使用整数除法和余操作%

let totalSeconds = Int(elapsedTime) // Total number of seconds as an integer 
let seconds = totalSeconds % 60  // Seconds to display 
let totalMinutes = totalSeconds/60 // Total number of minutes 
let minutes = totalMinutes % 60  // Minutes to display 
let hours = totalMinutes/60  // Hours to display 

这也可以很容易地扩展到更多的单位,如天。

注意

let strHours = hours > 9 ? String(hours):"0" + String(hours) 
let strMinutes = minutes > 9 ? String(minutes):"0" + String(minutes) 
let strSeconds = seconds > 9 ? String(seconds):"0" + String(seconds) 
displayTimeLabel.text = "\(strHours):\(strMinutes)" 
displaySecondsLabel.text = "\(strSeconds)" 

可以使用字符串格式化功能被简化:

displayTimeLabel.text = String(format: "%02d:%02d", hours, minutes) 
displaySecondsLabel.text = String(format: "%02d", seconds)