Я хотел бы создать функцию таймера обратного отсчета, когда пользователь может приостановить и возобновить работу с тем же нажатием кнопки. Я знаю, что было несколько подобных вопросов по SO, включая этот ответ one. Тем не менее, я все еще застрял (2-й день). Кажется, что мой таймер все еще тикает, несмотря на то, что он недействителен.Начало, пауза, возобновление NSTimer Swift
Вот мой код:
@IBOutlet weak var timerLabel: UILabel!
var duration: NSTimeInterval { return Double((exercise!.duration))! * 60 }
var interval: Double?
var timer = NSTimer()
var startTime = NSDate.timeIntervalSinceReferenceDate()
var elapsedTime: Double?
var timeLeft: Double?
var inProgress = false
var isPaused = false
var completionStatus = false
@IBAction func pressStart(sender: UIButton) {
if inProgress{
if isPaused {
resumeAnimation(timeLeftShapeLayer)
sender.setTitle("Pause", forState: UIControlState.Normal)
print("pressed resume, with \(timeLeft!) time left")
startTime = NSDate.timeIntervalSinceReferenceDate()
timer = NSTimer.scheduledTimerWithTimeInterval(timeLeft!, target: self, selector: #selector(PerformExerciseViewController.updateTime), userInfo: nil, repeats: false)
isPaused = false
} else {
pauseAnimation(timeLeftShapeLayer)
isPaused = true
sender.setTitle("Resume", forState: UIControlState.Normal)
elapsedTime = NSDate.timeIntervalSinceReferenceDate() - startTime
timeLeft = duration - elapsedTime!
timer.invalidate()
print("pressed pause, with \(timeLeft!) time left")
}
} else {
drawTimeLeftShape()
timeLeftShapeLayer.addAnimation(strokeIt, forKey: nil)
sender.setTitle("Pause", forState: UIControlState.Normal)
startTime = NSDate.timeIntervalSinceReferenceDate()
timer = NSTimer.scheduledTimerWithTimeInterval(duration, target: self, selector: #selector(PerformExerciseViewController.updateTime), userInfo: nil, repeats: false)
inProgress = true
isPaused = false
}
При печати время:
нажата пауза, с 56.3997309803963 оставшееся время (длинная пауза здесь, может быть, 10 сек.)
нажимается резюме, с 56.3997309803963 оставшееся время (супер короткое время воспроизведения 0,1 сек.)
нажатая пауза, с 47.3651859760284 оставшееся время (похоже, время, отсчитываемое во время паузы
Спасибо за помощь!