2014-02-21 2 views
1

사용자가 단추를 클릭 할 때 실행되는 간단한 카운트 다운 타이머 메서드가 있습니다.UIButton을 빨리 클릭하면 UIButton이 여러 번 메서드를 실행합니다.

사용자가 버튼을 클릭하면 카운트 다운 타이머가 1 초마다 카운트 다운되기 시작합니다. 그러나 버튼을 실제로 빨리 클릭하면 메서드가 여러 번 실행되어 카운트 다운 타이머가 가속화되고 괴물이 발생하는 것으로 나타났습니다. "편안한"클릭으로 한 번 클릭하면 정상적으로 작동합니다.

이제 클릭 한 후에 버튼을 비활성화하려했으나 한 번의 클릭으로 버튼을 사용할 수 없게되었습니다. 버튼을 여러 번 클릭하면 문제가 계속 발생합니다. 이 버튼은, 내가 "buttonClickTracker" 함께 노력하면 타이머를 시작하기 위해 할 수있는 몇 가지 컨트롤이 있지만이 해결되지 않았다 내가 추측하고있어

#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); 
    } 

: 여기

내 방법이 있습니다 문제. 이 빠른 클릭 시나리오가 발생하지 않도록하고 싶습니다. 그래서 도움을 얻을 수있어서 기쁩니다. :)

답변

1

을 :

- (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 초가 될 때까지 타이머가 작동하지 않기 때문에 더 많은 도청이 발생하는 1 초 창이 있습니다.

+0

도와 주셔서 감사합니다. 제이 코코 (Jason Coco)에게이 문제를 설명해 주셔서 감사합니다. – Oskariagon

0

이 사용해보십시오 : 당신은 타이머가 실행되고 있지 않은지 확인하지만, 당신은 시간을 설정하기 전에, YES의 체크 값을 변경 한 후에, 당신의 행동 방식에

- (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 초 창이 여전히 남아 있기 때문에 이제 다시 작동하지 않습니다. 이 메서드가 실행되는 동안 버튼이 비활성화되고 메서드가 종료 될 때 다시 활성화되지만 이벤트는 메인 큐에서만 전달되므로 어쨌든 발생합니다. 이벤트 처리기가 실행되는 동안 이벤트가 처리되지 않으므로 본질적으로 아무 작업도 수행하지 않습니다. –