2013-07-30 2 views
0

주어진 NSTimeInterval에서 카운트 다운 타이머를 만들려고하면 레이블이 업데이트되지 않는 것 같습니다.내 카운트 다운 타이머 방법에 문제가 있습니까?

- (IBAction)startTimer:(id)sender{ 
     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]; 
} 

- (void)timerAction:(NSTimer *)t { 

    if(testTask.timeInterval == 0){ 
     if (self.timer){ 
      [self timerExpired]; 
      [self.timer invalidate]; 
      self.timer = nil; 
     } 

     else { 
      testTask.timeInterval--; 
     } 
    } 

    NSUInteger seconds = (NSUInteger)round(testTask.timeInterval); 
    NSString *string = [NSString stringWithFormat:@"%02u:%02u:%02u", 
         seconds/3600, (seconds/60) % 60, seconds % 60]; 
    timerLabel.text = string; 
} 
+0

testTask는 사용자가 지정, 내가 10 초의 시간 간격으로 작업에서 테스트했습니다 :

당신은 같이 당신의 방법을 작성해야합니다. 그것은 10 초를 보여 주지만, 변화하는 것을 보여주지는 않습니다. – EvilAegis

+0

시간 간격이 실제로 감소하지 않습니다 – EvilAegis

+0

timerAction 메서드에 중단 점을 넣었습니까? 실제로 부름을 받았습니까? –

답변

2

문제는이 조건이 결코 true로 평가하지, 당신은 if(testTask.timeInterval == 0) 내부의 testTask.timeInterval을 감소시키는되어있다. 그래서 레이블에 변화가 없습니다.

첫 번째 if 문 다음에 else case를 넣어야합니다 (현재 두 번째 if 문 아래에 배치했습니다).

-(void)timerAction:(NSTimer *)t 
{ 
     if(testTask.timeInterval == 0) 
     { 
      if (self.timer) 
      { 
       [self timerExpired]; 
       [self.timer invalidate]; 
       self.timer = nil; 
      } 
     } 
     else 
     { 
      testTask.timeInterval--; 
     } 
     NSUInteger seconds = (NSUInteger)round(testTask.timeInterval); 
     NSString *string = [NSString stringWithFormat:@"%02u:%02u:%02u", 
         seconds/3600, (seconds/60) % 60, seconds % 60]; 
     timerLabel.text = string; 
} 
+0

그게 내 바보 같았 어. LOL 내 나쁜 – EvilAegis

+0

@ user2533646 : 나는 당신이 커피 한잔해야 할 것 같아 :) 행복한 코딩 :) –

2

if 문이 잘못 중첩 된 것 같습니다. else 문을 가장 바깥 쪽 'if'문으로 이동하십시오. (당신이 10로 설정 때문에)

if(testTask.timeInterval == 0){ 
     if (self.timer){ 
      [self timerExpired]; 
      [self.timer invalidate]; 
      self.timer = nil; 
     } 
    } else { 
     testTask.timeInterval--; 
    }