2012-09-25 75 views
5

在Cocoa中,當我們想要重繪一個視圖時,我們會發送一個setNeedsDisplay:消息來告訴視圖重新繪製一個參數爲YES的視圖。我想知道是否有任何情況下您想要發送視圖setNeedsDisplay:NO(如多線程環境),並且如果發送視圖setNeedsDisplay:YES,然後在setNeedsDisplay:NO之後立即再次設置視圖會使視圖重繪本身。如果沒有理由致電setNeedsDisplay:NO,那麼爲什麼要創建這樣一個繁瑣的方法,他們可以在那裏實現類似[view redrawView]setNeedsDisplay:沒有任何用處?

回答

1

setNeedsDisplay:NO可用於您想放棄之前稱爲setNeedsDisplay:YES的情況。例如。有時候將所有子視圖標記爲需要顯示然後運行一個算法來取消其中的一些標記會更容易。

-2

正如您所知,顯示更新在每次通過普通事件時都是自動的(如果需要)循環。如果需要,您可以撥打setNeedsDisplay:以強制顯示更新。

NSView文檔:

討論
每當用於繪製視圖對象的數據改變或狀態,該視圖應被髮送一個setNeedsDisplay:消息。標記爲需要顯示的NSView對象在每次通過應用程序的事件循環時自動重新顯示。 (需要重新顯示事件循環惡有惡報前先查看對象當然可以立即被送到適當的顯示...方法。)

這個函數的布爾參數只是指定是否 整個邊界的有問題的視圖是否受到影響,如果某些屬性「needsDisplay」設置爲true或false,則不行。因此, setNeedsDisplay:確實的工作幾乎就像一個「redrawView」,只有額外的參數。

編輯

以上是從同一文檔的啓發:

標誌
如果YES,標誌着接收機的整個邊界爲需要顯示;如果否,標記爲不需要顯示。

+3

這在很大程度上是不正確的。事件循環檢查是否需要重繪視圖,如'setNeedsDisplay:'被調用(它確實設置了一個標誌:' - [NSView needsDisplay]')。該方法絕對不會導致立即重繪,也不一定每次都會重繪每個視圖。您提到的強制繪製行爲由' - [NSView display]'和' - [NSView displayRect:]'提供。見http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40002978-CH11-112409 –

+0

不夠公平。我編輯了我的答案並解釋了信息的來源。 – Mundi

+1

@Mundi不幸的是,這並不完全回答我的問題。我問是否有任何用於'setNeedsDisplay:NO'的用法。 – TheAmateurProgrammer