2016-06-07 2 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) 
} 
} 
관련 문제