2014-02-21 6 views
1

У меня есть простой метод таймера обратного отсчета, который запускается, когда пользователь нажимает кнопку.UIButton многократно запускает методы при быстром нажатии на UIButton

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

Теперь я попытался отключить кнопку после щелчка, но это отключает кнопку только одним нажатием, проблема все же возникает, если я нажимаю кнопку несколько раз и быстро.

Вот мои методы:

#pragma mark - 
    #pragma mark startTimerButtonClicked 

    - (IBAction)startTimerButtonClicked:(UIButton *)sender 
    { 
     if (!self.timerIsRunning) // Run timer only if it's not allready running 
     { 
      [self setupTimer]; // Start the timer 
     } 
     else 
     { 
      NSLog(@"Timer should pause with secondsCounter: %d and not continue to run", secondsCounter); 
     } 
    } 

    #pragma mark - 
    #pragma mark setupTimer 

    - (void)setupTimer 
    { 
     /* -- Timer -- */ 
     self.timerWorkOutCountDown = [NSTimer scheduledTimerWithTimeInterval:1.0 
                   target:self 
                  selector:@selector(startTimer) 
                  userInfo:nil 
                   repeats:YES]; 
    } 

    #pragma mark - 
    #pragma mark Start timer 

    - (void)startTimer 
    { 
     self.timerIsRunning = YES; 

     secondsCounter = workOutSecondsCounter - 1; 
     int minutes = secondsCounter/60; 
     int seconds = secondsCounter - (minutes * 60); 

     NSString *timerOutput = [NSString stringWithFormat:@"00:%02d",seconds]; 

     [labelTimerCountDown setText:timerOutput]; 

     if (secondsCounter == 0) 
     { 
      [self resetTimerWithCount:0 andString:@"00:00"]; 
     } 
    } 

    #pragma mark - 
    #pragma mark Reset timer 

    - (void)resetTimerWithCount:(int)count andString:(NSString *)string 
    { 
     self.timerIsRunning = NO; 

     secondsCounter = count; 

     [timerWorkOutCountDown invalidate]; 
     timerWorkOutCountDown = nil; 

     [labelTimerCountDown setText:string]; 
    } 

    #pragma mark - 
    #pragma mark resetTimerButtonClicked 

    - (IBAction)resetTimerButtonClicked:(UIButton *)sender 
    { 
     [self resetTimerWithCount:20 andString:@"00:20"]; 
     NSLog(@"Reset timer secondsCounter: %d", secondsCounter); 
    } 

Я предполагаю, что есть некоторый контроль вы можете сделать, чтобы сделать кнопку только запустить таймер один раз, я пытался с "buttonClickTracker", но это не решило проблема. Я бы очень хотел, чтобы этот сценарий с быстрым щелчком произошел, поэтому я был бы рад за любую помощь, которую я могу получить. :)

ответ

1

В вашем методе действия, после того, как вы убедитесь, что таймер не работает, но перед тем, как установить время, изменить значение проверки на YES:

- (IBAction)startTimerButtonClicked:(UIButton *)sender 
{ 
    if (!self.timerIsRunning) // Run timer only if it's not allready running 
    { 
     // Time is running now 
     self.timerIsRunning = YES; 
     [self setupTimer]; // Start the timer 
    } 
    else 
    { 
     NSLog(@"Timer should pause with secondsCounter: %d and not continue to run", secondsCounter); 
    } 
} 

Если вы этого не сделаете - или в -setupTimer, есть 1-секундное окно, в котором больше кранов будет вызывать больше таймеров, так как таймер не срабатывает до тех пор, пока не начнется первая секунда.

+0

Огромное вам спасибо за помощь и объяснение этому мне @Jason Coco, это решило проблему! – Oskariagon

0

Попробуйте использовать это:

- (IBAction)startTimerButtonClicked:(UIButton *)sender 
{ 
    UIButton *button = (UIButton*) sender; 
    buttonname.userInteractionEnabled = NO; 
    if (!self.timerIsRunning) // Run timer only if it's not allready running 
    { 
     [self setupTimer]; // Start the timer 
    } 
    else 
    { 
     NSLog(@"Timer should pause with secondsCounter: %d and not continue to run", secondsCounter); 
    } 
    buttonname.userInteractionEnabled = YES; 
} 
+1

Если вы сделаете это, он решит эту проблему, но создаст новую ошибку, так как кнопка больше никогда не будет работать. –

+0

Я сделал userInteractionEnabled да снова, так что он будет работать ... –

+1

Теперь это не сработает, потому что все равно будет 1-секундное окно, в котором несколько кранов будут создавать несколько таймеров. Кнопка становится неактивной, пока этот метод работает только, а затем снова активен по мере выхода метода, но поскольку события доставляются только в основной очереди, это происходит в любом случае. Никакие события не обрабатываются во время выполнения обработчика событий, что делает отключить/включить по существу не-op. –

Смежные вопросы