2011-08-28 65 views
4

我發現有趣的事情..以下代碼不顯示@「一」,它顯示@「兩」後3秒延遲.. 我認爲@「一」需要被顯示,然後3秒延遲,然後@「兩個」需要彈出.. 我錯了嗎?iOS標籤文本改變與睡眠()

self.statusLabel.text = @"One"; 
sleep(3); 
self.statusLabel.text = @"Two"; 

謝謝..

回答

7

如果你在主線程中這樣做,那麼sleep(3)會阻止它,凍結應用程序3秒鐘。事件處理,包括重新繪製用戶界面等事情不會發生,直到結束。

爲了得到你期待什麼,嘗試這樣的事情:

[self.statusLabel setText:@"One"]; 
[self.statusLabel performSelector:@selector(setText:) 
         withObject:@"Two" 
         afterDelay:3.0]; 

做的第一變化,然後排隊等候進行第二次變化在未來發生的調用。然後將控制權返回給操作系統進行任何必要的重繪。

+0

我正在考慮另一種方法只改變標籤文本,但這很容易..謝謝:) – MomentH

+0

任何人可以告訴我如何根據值的數組更改標籤文本。通過使用上述方法,我可以一個接一個地更改標籤文本。但我希望通過使用循環或其他東西一個接一個地動態設置標籤文本 – Raj

+0

你想要一個NSTimer。 (performSelector:withObject:afterDelay:實際上是私人使用NSTimer。)編寫一個方法,將標籤的文本提升到下一個值;並設置一個定時器重複調用它。 – rgeorge

2

你的事情應該如何工作的觀念是不正確。

self.statusLabel.text = @"One"; 

這將statusLabel字段的值設置爲「One」。這不會立即畫到屏幕上。相反,該標籤將標記爲需要顯示。在當前運行循環結束時,將繪製標記爲所需顯示的所有視圖,然後將其內容刷新到屏幕。

接下來你要做:

sleep(3); 
self.statusLabel.text = @"Two"; 

此塊3秒(不退還運行循環做上述工作),然後改變這標誌着視圖值「兩個」主線程再次需要顯示。

當它最終繪製並刷新到屏幕上時,當前值爲「2」。

很難給出關於你應該做什麼的更具體的建議,因爲不清楚是否存在你正在嘗試解決的實際問題,或者只是試驗以便更多地瞭解框架。

但是你應該幾乎從不使用睡眠,而且你肯定不應該在幾秒鐘內阻塞睡眠主線程。

+0

謝謝清楚:)我正在考慮這與老派編程的方式..這意味着我可能需要做一個方法只改變標籤文本,以實現我所需要做的.. – MomentH

1

你錯了......

認爲它是這樣的:當你在一個塊中執行代碼你告訴你想要做什麼的iOS。在您將控制權交還給操作系統後,實際上只有執行了

你的代碼阻塞了主線程(這是一個非常糟糕的事情)。

你需要做的是將標籤設置爲「One」,然後設置一個計時器,它將在三秒鐘內啓動。定時器中的代碼將標籤的文本設置爲「兩個」。

+0

是的..現在我我正在理解它是如何工作的。謝謝:) – MomentH