Dynamically Updating a UILabel

I have a question regarding UILabels. I'm not even sure it is the right way to pull this off but I am trying to update a UILabel to display two numbers from 0 to 24 then loop back to zero and display the numer squence again. The catch is, it needs to update the UILabel every 1/24 of a second. Here is the code I have so far...

- (void)viewDidLoad {
    fpsTimer = [NSTimer scheduledTimerWithTimeInterval: .01 target: self selector: @selector(updateFpsDisplay) userInfo: nil repeats: YES];
}

- (void)updateFpsDisplay {
    for (int i=0; i<100; i++) {
        NSLog(@"%d", i%24);
        [timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", i%24]];
    }
}

This code successfully prints out the numbers 1-24 in a loop in the console at run-time, However the UILabel named "timecodeFrameLabel" just shows 03 and does not change.

Any suggestions?


Solution 1:

There are two problems here. The first is that your -updateFpsDisplay method loops from 0 to 99, changing the label each time through the loop. However, the label won't actually be redrawn until control returns to the run loop. So, every 0.01 seconds, you change the label 100 times, and then the display updates once. Get rid of the loop and let your timer tell you when to update the label, and when you do, update it just once. You'll want to take your counter variable i and make that an instance variable (hopefully with a more descriptive name) rather than a variable local to that method.

- (void)updateFpsDisplay {
    // the ivar frameCount replaces i
    [timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", frameCount%24]];
}

The second problem is that 100 is not a multiple of 24. When you say 99 % 24 == 3, which is why your label always says "3". After you've changed your code as described above, add a check to your method -updateFpsDisplay so that frameCount is reset each time it hits 0, like:

if (frameCount % 24 == 0) {
    frameCount = 0;
}

That'll prevent frameCount from getting so large that it rolls over at some point.