我有一個for()循環的方法。在那個循環中,mylabel.text被更新多次。但是,直到方法完成後,實際標籤纔會在屏幕上更新,並使用for()循環中創建的最後一個值進行更新。在for()循環中更新UILabel
使用一個NSLog,它在for()循環的中間進行更新,我看到這個值確實多次改變了標籤。
iOS中不更新for()循環中的標籤是否是一般慣例?我會想象有一種方法可以做到這一點。
我有一個for()循環的方法。在那個循環中,mylabel.text被更新多次。但是,直到方法完成後,實際標籤纔會在屏幕上更新,並使用for()循環中創建的最後一個值進行更新。在for()循環中更新UILabel
使用一個NSLog,它在for()循環的中間進行更新,我看到這個值確實多次改變了標籤。
iOS中不更新for()循環中的標籤是否是一般慣例?我會想象有一種方法可以做到這一點。
,你可以告訴運行循環使UI更新這樣運行:
for (NSInteger i = 0; i < 10; i++) {
[label setText:...];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}
是的,運行循環已經在運行,但要像上面的例子那樣運行它將處理輸入源,包括UI更新。 – 2011-06-15 20:37:23
的確非常漂亮。我不禁感到操作runloop存在一些危險,但它確實有效,謝謝。 – johnbakers 2011-06-15 21:08:53
請注意,這可能會有各種奇怪的副作用。當你調用'runMode:beforeDate:'時,你的循環中間會發生各種各樣的事情。定時器可能會啓動; WebKit可以做各種瘋狂;延遲選擇器可以觸發。這是一個非常危險的伎倆。有時候是有用的,偶爾也是必需的(特別是在Mac上),但不是通用工具。 – 2012-05-02 13:06:36
嘗試
[yourLabel setNeedsDisplay];
不完全。 '-setNeedsDisplay'計劃在後續運行循環中更新視圖 - 它不會立即觸發重新繪製。 – 2011-06-15 20:31:30
從我先前的評論:
注意,這(
runMode:beforeDate:
)可以有各種奇怪的副作用。當你調用runMode:beforeDate時,所有類型的事情都可能發生在你的循環中。定時器可能會啓動; WebKit可以做各種瘋狂;延遲選擇器可以觸發。這是一個非常危險的伎倆。有時候是有用的,偶爾也是必需的(特別是在Mac上),但不是通用工具。
更好的解決方案是安排在主調度隊列您的更新:
for (NSInteger i = 0; i < 10; i++) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, i * NSEC_PER_SEC),
dispatch_get_main_queue(), ^{
[self.label setText:[NSString stringWithFormat:@"%d", i]];
});
}
這個時間表10次的更新間隔1秒。它可以適應各種其他需求,而無需在主運行循環中創建阻塞方法。
這很好。非常感謝。你是一個拯救生命的人! – user1752054 2015-01-06 18:17:26
真棒回答,謝謝 – channi 2015-12-11 04:04:38
如何更新'UILabel'的值? – Saphrosit 2011-06-15 20:23:28
[動態更新UILabel](http://stackoverflow.com/questions/6336991/dynamically-updating-a-uilabel)和[文本字段等待直到更新循環結束](http:// stackoverflow.com/questions/5829977/nstextfield-waits-until-the-end-of-a-loop-to-update)和[Loop to change label text](http://stackoverflow.com/questions/6325202/objective -c-loop-to-change-label-text)和[調用睡眠和更新文本字段不工作](http://stackoverflow.com/questions/5834062/calling-sleep5-and-updating-text-field-not工作) – 2011-06-15 20:28:32
請參閱:http://stackoverflow.com/questions/6325202和http://stackoverflow.com/questions/5829977 – 2011-06-15 20:29:48