在iOS中暂停和恢复计时器

Gug*_*thu 1 timer ios swift

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

//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

        }

    }
Run Code Online (Sandbox Code Playgroud)

Cja*_*jay 6

这是我曾经用来跟踪时间的一些代码

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)
}
}
Run Code Online (Sandbox Code Playgroud)


DJo*_*son 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

    }

  }
}
Run Code Online (Sandbox Code Playgroud)