Bri*_*ian 0 objective-c nstimer uilabel
我有一个关于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]];
}
}
Run Code Online (Sandbox Code Playgroud)
此代码在运行时成功打印出控制台循环中的数字1-24,但名为"timecodeFrameLabel"的UILabel只显示03并且不会更改.
有什么建议?
这里有两个问题.第一个是你的-updateFpsDisplay方法从0循环到99,每次循环都改变标签.但是,在控制返回到运行循环之前,标签实际上不会被重绘.因此,每0.01秒,您将标签更改100次,然后显示更新一次.摆脱循环,让你的计时器告诉你何时更新标签,当你这样做时,只需更新一次.您将需要获取计数器变量i并使其成为实例变量(希望具有更具描述性的名称),而不是该方法的本地变量.
- (void)updateFpsDisplay {
// the ivar frameCount replaces i
[timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", frameCount%24]];
}
Run Code Online (Sandbox Code Playgroud)
第二个问题是100不是24的倍数.当你说99%24 == 3时,这就是为什么你的标签总是说"3".在您按上述方法更改了代码后,请在方法中添加一个检查,-updateFpsDisplay以便frameCount每次达到0时重置,例如:
if (frameCount % 24 == 0) {
frameCount = 0;
}
Run Code Online (Sandbox Code Playgroud)
这将防止frameCount变得如此之大以至于它在某些时候翻滚.