在iOS中暂停和恢复计时器

时间:2016-06-07 10:52:15

标签: ios swift timer

这是一个常见的问题,但大多数答案似乎都不起作用。我的应用程序中有一个计时器,我可以轻松启动并重新启动计时器。我试图暂停和恢复计时器,但现在恢复只从计时器继续计时器,该计时器大于我恢复它的计时器。这可能意味着它继续在后台计算。这是我的代码:

type FileError struct {
    Path string
}

func (e *FileError) Error() string {
    return fmt.Sprintf("Error opening image file: %s", e.Path)
}

func getFile(path string) (string, error) {
    return "", &FileError{Path: path}
}

func main() {
    f := "problem.txt"
    _, err := getFile(f)
    if ferr, ok := err.(* FileError); ok {
        fmt.Println(ferr)
    }
}

2 个答案:

答案 0 :(得分:5)

我有一个自定义计时器应用程序并处理同样的问题。有很多方法可以解决这个问题。您可能希望像pausedTime那样跟踪elapsedTime,并从其他变量中减去该值。这为您提供了一些灵活性,以显示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

    }

  }
}

答案 1 :(得分:2)

以下是我曾用于跟踪时间的一些代码

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)
}
}