EvilAegis
EvilAegis

Reputation: 733

What is wrong with my countdown timer method?

Trying to make a countdown timer from a given NSTimeInterval, the label doesn't seem to be updating.

- (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;
}

Upvotes: 0

Views: 198

Answers (2)

Midhun MP
Midhun MP

Reputation: 107121

Issue is, you are decrementing the testTask.timeInterval inside the if(testTask.timeInterval == 0) , this condition never evaluates to true (because you set it to 10). That is why there is no change in the label.

You need to put that else case after the first if statement (Currently you placed it under second if statement).

You need to write your method like:

-(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;
}

Upvotes: 2

hgwhittle
hgwhittle

Reputation: 9426

I believe your if statements are nested incorrectly. Move your else statement to the outermost 'if' like so.

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

Upvotes: 2

Related Questions