2016-05-31 37 views
0

爲什麼我的秒錶上的啓動按鈕會在按下停止按鈕後重置計時器?一切工作正常,直到我停止計時器,然後重新啓動它。它應繼續從它停止的點,而是它的計時器重置爲0。這裏是我的代碼:停止啓動後,我的秒錶上的啓動按鈕重置計時器swift

類的ViewController:UIViewController的{

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

@IBOutlet var displayTimeLabel: UILabel! 

@IBAction func start(sender: AnyObject) { 

    if !timer.valid { 

     timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true) 

    } 

    startTime = NSDate.timeIntervalSinceReferenceDate() 

} 

@IBAction func stop(sender: AnyObject) { 

    timer.invalidate() 
} 

func updateTime() { 

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

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

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

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

    let fraction = UInt8(elapsedTime * 100) 

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

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

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

+0

你在你的'start'方法重置'startTime'功能的復位按鈕。如果你想繼續,不要這樣做 – Paulw11

+0

如果我把這行代碼拿出來,那麼我得到這個問題:致命錯誤:浮點值不能轉換爲UInt8,因爲它大於UInt8.max @ Paulw11 – nodyor90z

回答

0

你設置你startTime每次調用start方法。您只希望在首次調用時執行此操作。您可以使用可選項來正確確定狀態,並且只在最初爲零時才設置startTime

然後,您可以創建簡單地設置startDate = nil

class ViewController: UIViewController { 

    var timer : NSTimer? 
    var startTime? : NSTimeInterval? 
    var accumulatedTime = NSTimeInterval() 

    @IBOutlet var displayTimeLabel: UILabel! 

    @IBAction func start(sender: AnyObject) { 

     guard self.timer == nil else { 
      return 
     } 

     self.startTime = NSDate.timeIntervalSinceReferenceDate() 

     self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true) 
    } 

    @IBAction func stop(sender: AnyObject) { 

     guard self.timer != nil else { 
      return 
     } 

     self.timer!.invalidate() 
     self.timer = nil 
    } 

    func updateTime() { 

     let currentTime = NSDate.timeIntervalSinceReferenceDate() 
     let intervalTime = currentTime - startTime! 
     self.startTime = currentTime 
     self.accumulatedTime += intervalTime 

     var elapsedTime = self.accumulatedTime 

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

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

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

     let fraction = UInt8(elapsedTime * 100) 

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

    } 
} 
+0

這個工程好一點。但是爲什麼計時器不能從停止按鈕被按下的位置繼續?看起來好像它仍然在後臺運行,並且一旦再次點擊開始時更新標籤。當按下停止按鈕時,我現在如何使它從確切點繼續? – nodyor90z

+0

因爲您的方法是採取開始時間和停止時間之間的差異,而不是在定時器運行時累積時間。 – Paulw11

+0

查看我更新的答案;它會在每次定時器啓動時(並且每次按下啓動按鈕時)都重置startTime。這樣,它可以計算定時器點火和總的經過時間之間的時間間隔,當定時器停止時停止。 – Paulw11

相關問題