2011-06-15 75 views
5

我有一個for()循環的方法。在那個循環中,mylabel.text被更新多次。但是,直到方法完成後,實際標籤纔會在屏幕上更新,並使用for()循環中創建的最後一個值進行更新。在for()循環中更新UILabel

使用一個NSLog,它在for()循環的中間進行更新,我看到這個值確實多次改變了標籤。

iOS中不更新for()循環中的標籤是否是一般慣例?我會想象有一種方法可以做到這一點。

+0

如何更新'UILabel'的值? – Saphrosit 2011-06-15 20:23:28

+2

[動態更新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

+1

請參閱:http://stackoverflow.com/questions/6325202和http://stackoverflow.com/questions/5829977 – 2011-06-15 20:29:48

回答

14

,你可以告訴運行循環使UI更新這樣運行:

for (NSInteger i = 0; i < 10; i++) { 
    [label setText:...]; 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]; 
} 
+1

是的,運行循環已經在運行,但要像上面的例子那樣運行它將處理輸入源,包括UI更新。 – 2011-06-15 20:37:23

+0

的確非常漂亮。我不禁感到操作runloop存在一些危險,但它確實有效,謝謝。 – johnbakers 2011-06-15 21:08:53

+2

請注意,這可能會有各種奇怪的副作用。當你調用'runMode:beforeDate:'時,你的循環中間會發生各種各樣的事情。定時器可能會啓動; WebKit可以做各種瘋狂;延遲選擇器可以觸發。這是一個非常危險的伎倆。有時候是有用的,偶爾也是必需的(特別是在Mac上),但不是通用工具。 – 2012-05-02 13:06:36

-2

嘗試

[yourLabel setNeedsDisplay]; 
+3

不完全。 '-setNeedsDisplay'計劃在後續運行循環中更新視圖 - 它不會立即觸發重新繪製。 – 2011-06-15 20:31:30

7

從我先前的評論:

注意,這( 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秒。它可以適應各種其他需求,而無需在主運行循環中創建阻塞方法。

+0

這很好。非常感謝。你是一個拯救生命的人! – user1752054 2015-01-06 18:17:26

+0

真棒回答,謝謝 – channi 2015-12-11 04:04:38