NSTimer Проблема с моим секундомером - PullRequest
0 голосов
/ 29 февраля 2012

Вот моя проблема, Когда я нажимаю на кнопку запуска, запускается таймер, а когда я нажимаю на кнопку остановки, он останавливается. Однако, когда я снова нажимаю на кнопку запуска, он возвращается к нулю. Я бы хотел, чтобы кнопка запуска продолжалась там, где остановился таймер.

.h

NSTimer *stopWatchTimer;
    NSDate *startDate;
    @property (nonatomic, retain) IBOutlet UILabel *stopWatchLabel;
    - (IBAction)onStartPressed;
    - (IBAction)onStopPressed;
    - (IBAction)onResetPressed;

.m

    - (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.SSS"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    stopWatchLabel.text = timeString;
    }
    - (IBAction)onStartPressed {
    startDate = [NSDate date];
    // Create the stop watch timer that fires every 10 ms
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES];
    }
    - (IBAction)onStopPressed {
    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
    [self updateTimer];
    }
    - (IBAction)onResetPressed {
    stopWatchLabel.text = @”00:00:00:000″;
    }

Пожалуйста, помогите спасибо

1 Ответ

0 голосов
/ 01 марта 2012

У вас проблемы с состоянием.Одним состоянием было бы то, что кнопка запуска нажата, но кнопка сброса не была нажата до этого.Другое состояние состоит в том, что кнопка запуска нажата, и кнопка сброса была нажата перед этим.Одна вещь, которую вы можете сделать, это создать iVar для отслеживания этого состояния.Поэтому используйте BOOL следующим образом:

Сначала объявите iVar:

BOOL resetHasBeenPushed;

Инициализируйте значение NO.

Затем сделайте это

 - (IBAction)onResetPressed {
    stopWatchLabel.text = @”00:00:00:000″;
    resetHasBeenPushed = YES;

Теперь вам нужно в какой-то момент установить его обратно в NO, и это может быть сделано в методе start:

- (IBAction)onStartPressed {
    startDate = [NSDate date];
    // Create the stop watch timer that fires every 10 ms
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES];
    resetHasBeenPushed = NO;
}
    }

Кстати, если вы сделаете свой NSDateFormatter в iVar, вы ненужно инициализировать его повторно.Переместите следующие строки в свой код inti или в другое место, где он выполняется только один раз:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

ОБНОВЛЕНИЕ

Попробуйте это:

- (IBAction)onStartPressed {
    if (resetHasBeenPushed== YES) {
        startDate = [NSDate date];  // This will reset the "clock" to the time start is set
    }

    // Create the stop watch timer that fires every 10 ms
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES];
    }
...