动态更新UILabel

时间:2011-06-13 22:07:49

标签: objective-c uilabel nstimer

我对UILabels有疑问。我甚至不确定这是否正确的方法,但我试图更新UILabel以显示0到24之间的两个数字然后循环回零并再次显示数字序列。问题是,它需要每1/24秒更新一次UILabel。这是我到目前为止的代码......

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

此代码在运行时成功打印出控制台循环中的数字1-24,但名为“timecodeFrameLabel”的UILabel只显示03并且不会更改。

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

这里有两个问题。首先,您的-updateFpsDisplay方法从0循环到99,每次循环都会更改标签。但是,在控制返回到运行循环之前,标签实际上不会被重绘。因此,每0.01秒,您将标签更改100次,然后显示更新一次。摆脱循环,让你的计时器告诉你何时更新标签,当你这样做时,只需更新一次。您将需要使用计数器变量i并将其作为实例变量(希望使用更具描述性的名称)而不是该方法的本地变量。

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

第二个问题是100不是24的倍数。当你说99%24 == 3时,这就是为什么你的标签总是说“3”。在您按上述方法更改了代码后,请在方法-updateFpsDisplay中添加一项检查,以便frameCount每次达到0时都会重置,例如:

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

这会阻止frameCount变得如此之大以至于它在某个时候翻滚。