При расчете текущего дисплея всегда используется исходное время запуска таймера, поэтому дисплей после паузы включает интервал, в течение которого таймер был приостановлен.
Самое простое, что можно сделать, это сохранить другое NSTimeInterval
, скажем secondsAlreadyRun
, когда таймер приостановлен, и добавьте его к интервалу времени, который вы рассчитываете при возобновлении работы.Вам нужно будет обновлять таймер startDate
каждый раз, когда таймер начинает отсчет.В reset:
вы также можете очистить этот интервал secondsAlreadyRun
.
-(void)showActivity:(NSTimer *)tim {
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
// Add the saved interval
timeInterval += secondsAlreadyRun;
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"mm:ss.SS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *timeString=[dateFormatter stringFromDate:timerDate];
stopWatchLabel.text = timeString;
[dateFormatter release];
}
- (IBAction)onStartPressed:(id)sender {
stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1/10
target:self
selector:@selector(showActivity:)
userInfo:nil
repeats:YES];
// Save the new start date every time
startDate = [[NSDate alloc] init]; // equivalent to [[NSDate date] retain];
[stopWatchTimer fire];
}
- (IBAction)onStopPressed:(id)sender {
// _Increment_ secondsAlreadyRun to allow for multiple pauses and restarts
secondsAlreadyRun += [[NSDate date] timeIntervalSinceDate:startDate];
[stopWatchTimer invalidate];
stopWatchTimer = nil;
[startDate release];
[self showActivity];
}
- (IBAction)reset:(id)sender; {
secondsAlreadyRun = 0;
stopWatchLabel.text = @"00:00.00";
}
Не забудьте выпустить этот startDate
где угодно!Также имейте в виду, что документированный интерфейс NSTimer
предназначен для того метода, который вы даете ему, чтобы он принимал один аргумент, которым будет сам таймер.Кажется, что это работает без этого, но зачем искушать судьбу?
Наконец, поскольку вы так много используете NSDateFormatter
, вы можете подумать о том, чтобы сделать его иваром или поместить его в хранилище static
вshowActivity:
, вот так:
static NSDateFormatter * dateFormatter = nil;
if( !dateFormatter ){
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"mm:ss.SS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
}