2011-06-13 125 views
0

我有一個關於UILabels的問題。我甚至不確定這是正確的方法,但我試圖更新UILabel以顯示兩個數字,從0到24,然後循環回到零並再次顯示數字序列。值得注意的是,它需要每1/24秒更新一次UILabel。下面是代碼我到目前爲止...動態更新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在運行時在控制檯的循環,然而,的UILabel名爲「timecodeFrameLabel」只是表明03和不會改變。

有什麼建議嗎?

+0

[NSTextField可能重複等待,直到更新循環結束](http://stackoverflow.com/questions/5829977/nstextfield-waits-until-the-end-of-a-loop-to-update )。即使這個問題涉及NSTextField並且這是UILabel,也適用相同的基礎問題。 – 2011-06-13 22:14:57

回答

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從得到如此之大,它卷在某些時候。

+0

這花了一些時間來做我想做的事情,但它確實可以在UILabel上顯示24fps。謝謝您的幫助! – Brian 2011-06-26 18:30:09