我發現有趣的事情..以下代碼不顯示@「一」,它顯示@「兩」後3秒延遲.. 我認爲@「一」需要被顯示,然後3秒延遲,然後@「兩個」需要彈出.. 我錯了嗎?iOS標籤文本改變與睡眠()
self.statusLabel.text = @"One";
sleep(3);
self.statusLabel.text = @"Two";
謝謝..
我發現有趣的事情..以下代碼不顯示@「一」,它顯示@「兩」後3秒延遲.. 我認爲@「一」需要被顯示,然後3秒延遲,然後@「兩個」需要彈出.. 我錯了嗎?iOS標籤文本改變與睡眠()
self.statusLabel.text = @"One";
sleep(3);
self.statusLabel.text = @"Two";
謝謝..
如果你在主線程中這樣做,那麼sleep(3)
會阻止它,凍結應用程序3秒鐘。事件處理,包括重新繪製用戶界面等事情不會發生,直到結束。
爲了得到你期待什麼,嘗試這樣的事情:
[self.statusLabel setText:@"One"];
[self.statusLabel performSelector:@selector(setText:)
withObject:@"Two"
afterDelay:3.0];
做的第一變化,然後排隊等候進行第二次變化在未來發生的調用。然後將控制權返回給操作系統進行任何必要的重繪。
你的事情應該如何工作的觀念是不正確。
self.statusLabel.text = @"One";
這將statusLabel字段的值設置爲「One」。這不會立即畫到屏幕上。相反,該標籤將標記爲需要顯示。在當前運行循環結束時,將繪製標記爲所需顯示的所有視圖,然後將其內容刷新到屏幕。
接下來你要做:
sleep(3);
self.statusLabel.text = @"Two";
此塊3秒(不退還運行循環做上述工作),然後改變這標誌着視圖值「兩個」主線程再次需要顯示。
當它最終繪製並刷新到屏幕上時,當前值爲「2」。
很難給出關於你應該做什麼的更具體的建議,因爲不清楚是否存在你正在嘗試解決的實際問題,或者只是試驗以便更多地瞭解框架。
但是你應該幾乎從不使用睡眠,而且你肯定不應該在幾秒鐘內阻塞睡眠主線程。
謝謝清楚:)我正在考慮這與老派編程的方式..這意味着我可能需要做一個方法只改變標籤文本,以實現我所需要做的.. – MomentH
你錯了......
認爲它是這樣的:當你在一個塊中執行代碼你告訴你想要做什麼的iOS。在您將控制權交還給操作系統後,實際上只有執行了。
你的代碼阻塞了主線程(這是一個非常糟糕的事情)。
你需要做的是將標籤設置爲「One」,然後設置一個計時器,它將在三秒鐘內啓動。定時器中的代碼將標籤的文本設置爲「兩個」。
是的..現在我我正在理解它是如何工作的。謝謝:) – MomentH
我正在考慮另一種方法只改變標籤文本,但這很容易..謝謝:) – MomentH
任何人可以告訴我如何根據值的數組更改標籤文本。通過使用上述方法,我可以一個接一個地更改標籤文本。但我希望通過使用循環或其他東西一個接一個地動態設置標籤文本 – Raj
你想要一個NSTimer。 (performSelector:withObject:afterDelay:實際上是私人使用NSTimer。)編寫一個方法,將標籤的文本提升到下一個值;並設置一個定時器重複調用它。 – rgeorge