2014-11-02 61 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)