2016-06-07 49 views
1

這是一個常見問題,但大多數答案似乎不起作用。我在我的應用程序中有一個計時器,我可以輕鬆啓動並重新啓動計時器。我正在嘗試暫停並恢復計時器,但現在只能繼續計時器的計時器,而計時器的計時器大於恢復的時間。這可能意味着它在後臺繼續計數。這是我的代碼:在iOS中暫停和恢復計時器

//Timer Variables 
var startTime = NSTimeInterval() 
var timer = NSTimer() 
var isTiming = Bool() 
var isPaused = Bool() 

func updatedTimer() { 

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

     workoutTime.text = "\(strMinutes) : \(strSeconds)" 

    } 


    @IBAction func startButtonTapped(sender: AnyObject) { 

     if !timer.valid { 

      timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(TimedWorkoutViewController.updatedTimer), userInfo: nil, repeats: true) 
      startTime = NSDate.timeIntervalSinceReferenceDate() 
     } 

     isTiming = true 
     isPaused = false 

    } 


    @IBAction func pauseAndContinueButtonTapped(sender: AnyObject) { 

     if isTiming == true && isPaused == false { 

      timer.invalidate() //Stop the Timer 
      isPaused = true //isPaused 
      isTiming = false //Stopped Timing 
      pauseButton.setTitle("RESUME", forState: UIControlState.Normal) //Set Button to Continue state 


      print(startTime) 


     } else if isTiming == false && isPaused == true { 

      if !timer.valid { 

       timer.invalidate() 
       //timer = nil 

       timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(TimedWorkoutViewController.updatedTimer),  userInfo: nil, repeats: true) 

      } 


      isPaused = false 
      isTiming = true 
      pauseButton.setTitle("PAUSE", forState: UIControlState.Normal) //Set Button to Continue state 

     } 

    } 

回答

4

我有一個自定義計時器應用程序,並處理相同的問題。有很多方法可以解決這個問題。您可能需要像elapsedTime那樣跟蹤pausedTime,並從其他變量中減去該值。這給你一些靈活性,以及​​顯示totalTimeelapsedTime等......我的功能有點不同,所以我改裝它到你的設置。

基本上,暫停是不同的,因爲你可以暫停/恢復多次。所以你需要跟蹤以前的暫停和當前的暫停狀態,並從經過的時間(或總時間,或任何你想要的)中減去。

我測試了這段代碼,它工作。給它一個嘗試,讓我知道:

import UIKit 

class TimedWorkoutViewController: UIViewController { 

    @IBOutlet weak var pauseButton: UIButton! 
    @IBOutlet weak var startButton: UIButton! 

    var startTime = NSTimeInterval() 
    var timer = NSTimer() 
    var isTiming = Bool() 
    var isPaused = Bool() 
    var pausedTime: NSDate? //track the time current pause started 
    var pausedIntervals = [NSTimeInterval]() //track previous pauses 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    } 

    func updatedTimer() { 
    let currentTime = NSDate.timeIntervalSinceReferenceDate() 
    var pausedSeconds = pausedIntervals.reduce(0) { $0 + $1 } //calculate total time timer was previously paused 
    if let pausedTime = pausedTime { 
     pausedSeconds += NSDate().timeIntervalSinceDate(pausedTime) //add current pause if paused 
    } 
    var elapsedTime: NSTimeInterval = currentTime - startTime - pausedSeconds //subtract time paused 
    let minutes = Int(elapsedTime/60.0) 

    elapsedTime -= (NSTimeInterval(minutes) * 60) 
    let seconds = Int(elapsedTime) 

    elapsedTime -= NSTimeInterval(seconds) 

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

    workoutTime.text = "\(strMinutes) : \(strSeconds)" 
    } 


    @IBAction func startButtonTapped(sender: AnyObject) { 

    if !timer.valid { 

     timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(TimedWorkoutViewController.updatedTimer), userInfo: nil, repeats: true) 
     startTime = NSDate.timeIntervalSinceReferenceDate() 
    } 

    isTiming = true 
    isPaused = false 
    pausedIntervals = [] //reset the pausedTimeCollector on new workout 
    } 


    @IBAction func pauseAndContinueButtonTapped(sender: AnyObject) { 

    if isTiming == true && isPaused == false { 

     timer.invalidate() //Stop the Timer 
     isPaused = true //isPaused 
     isTiming = false //Stopped Timing 
     pausedTime = NSDate() //asuuming you are starting a brand new workout timer 
     pauseButton.setTitle("RESUME", forState: UIControlState.Normal) //Set Button to Continue state 

    } else if isTiming == false && isPaused == true { 

     let pausedSeconds = NSDate().timeIntervalSinceDate(pausedTime!) //get time paused 
     pausedIntervals.append(pausedSeconds) // add to paused time collector 
     pausedTime = nil //clear current paused state 

     if !timer.valid { 

     timer.invalidate() 
     //timer = nil 

     timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: #selector(TimedWorkoutViewController.updatedTimer),  userInfo: nil, repeats: true) 

     } 


     isPaused = false 
     isTiming = true 
     pauseButton.setTitle("PAUSE", forState: UIControlState.Normal) //Set Button to Continue state 

    } 

    } 
} 
+0

你介意分享你的代碼,如果你還有嗎? – Gugulethu

+0

太棒了。完美工作。非常感謝。 – Gugulethu

+0

因此,在說'pausedIntervals.append(pausedSeconds)'的行上,我得到以下錯誤:'無法將類型'(Date) - > TimeInterval'的值轉換爲期望的參數類型'TimeInterval'(又名'Double')' 任何想法爲什麼?幾次谷歌搜索仍然沒有。 –

1

下面是一些代碼,我曾經被用來跟蹤時間

class TimeTracker : NSObject { 
private var startTime:NSTimeInterval? 
private var timer:NSTimer? 
private var elapsedTime = 0.0 
private var pausedTimeDifference = 0.0 
private var timeUserPaused = 0.0 
var delegate:TimeTrackerDelegate? 

func setTimer(timer:NSTimer){ 
    self.timer = timer 
} 

func isPaused() -> Bool { 
    return !timer!.valid 
} 

func start(){ 
    if startTime == nil { 
     startTime = NSDate.timeIntervalSinceReferenceDate() 
     newTimer() 
    } 
} 

func pause(){ 
    timer!.invalidate() 
    timeUserPaused = NSDate.timeIntervalSinceReferenceDate() 
} 

func resume(){ 
    pausedTimeDifference += NSDate.timeIntervalSinceReferenceDate() - timeUserPaused; 
    newTimer() 
} 

func handleTimer(){ 
    let currentTime = NSDate.timeIntervalSinceReferenceDate() 
    elapsedTime = currentTime - pausedTimeDifference - startTime! 
    delegate!.handleTime(elapsedTime) 
} 

func reset(){ 
    pausedTimeDifference = 0.0 
    timeUserPaused = 0.0 
    startTime = NSDate.timeIntervalSinceReferenceDate() 
    newTimer() 
} 

private func newTimer(){ 
    timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target:self , selector: "handleTimer", userInfo: nil, repeats: true) 
} 
}