0

I know that there is no way to pause a timer using NSTimer. I know i have to store the date and call it again. I have tried every solution and i cannot find any that have successfully worked. So my question is, does anyone know how to pause and resume?

user3839056
  • 47
  • 1
  • 8

1 Answers1

0

This worked good for me. Created 2 UIButtons ('startButton' & 'resetButton'), a UILabel to display time ('timeLabel'), NSTimeInterval ('pauseTimeInterval'), NSTimer (stopWatchTimer') and used the following code:

NSDate *pauseStart, *previousFireDate, *startDate;
NSTimeInterval pauseTimeInterval;
NSTimer *stopWatchTimer;


-(void)pauseTimer{
    pauseStart = [NSDate dateWithTimeIntervalSinceNow:0];
    previousFireDate = [self fireDate];
    [self setFireDate:[NSDate distantFuture]];
}


-(void)resumeTimer{
    float pauseTime = -1*[pauseStart timeIntervalSinceNow];
    [self setFireDate:[previousFireDate initWithTimeInterval:pauseTime sinceDate:previousFireDate]];
}

-(IBAction)startTime:(id)sender {

    //start timer
    if ([startButton.titleLabel.text isEqualToString:@"Start"] && (![self.stopWatchTimer isValid]) && ([timeLabel.text isEqualToString:@"00:00:00"]))
{
        [startButton setTitle:@"Stop" forState:UIControlStateNormal];
        startDate = [NSDate date];
        startDate = [startDate dateByAddingTimeInterval:((-1)*(pauseTimeInterval))];
        self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                             target:self
                                           selector:@selector(updateTimer)
                                           userInfo:nil
                                            repeats:YES];


        resetButton.hidden = YES;

    }

    //pause timer
    else if (([self.stopWatchTimer isValid]) && ([startButton.titleLabel.text isEqualToString:@"Stop"]))
    {
        [startButton setTitle:@"Resume" forState:UIControlStateNormal];
        [self.stopWatchTimer pauseTimer];
        resetButton.hidden = NO;

    }

    //resume timer
    else {
        [startButton setTitle:@"Stop" forState:UIControlStateNormal];
        startDate = [NSDate date];
        startDate = [startDate dateByAddingTimeInterval:((-1)*(pauseTimeInterval))];
        [self.stopWatchTimer resumeTimer];
        resetButton.hidden = YES;

        }
    }

-(IBAction)resetTime:(id)sender {

    [self.stopWatchTimer invalidate];
    self.stopWatchTimer = nil;
    self.timeLabel.text = @"00:00:00";
    [startButton setTitle:@"Start" forState:UIControlStateNormal];
    pauseTimeInterval = 0.0;
    resetButton.hidden = YES;
}


-(void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm:ss"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    self.timeLabel.text = timeString;
    pauseTimeInterval = timeInterval;

}
hitme
  • 194
  • 1
  • 6