2012-09-25 4 views
5

Wenn wir in Cocoa eine Ansicht neu zeichnen möchten, senden wir der Ansicht eine setNeedsDisplay: Nachricht, die die Ansicht anweist, sich mit einem Parameter von YES neu zu zeichnen. Ich frage mich, ob es Umstände gibt, wo Sie eine Ansicht setNeedsDisplay:NO, wie Multithreading-Umgebungen, senden möchten, und wenn Sie eine Ansicht setNeedsDisplay:YES senden, würde die Ansicht sofort danach erneut mit setNeedsDisplay:NO die Zeichnung neu zeichnen. Wenn es keine Gründe dafür sind setNeedsDisplay:NO zu nennen, warum eine solche mühsame Methode erstellen, wo sie stattdessen so etwas wie [view redrawView]Ist setNeedsDisplay: NEIN überhaupt brauchbar?

Antwort

1

setNeedsDisplay:NO kann verwendet werden, falls Sie vorher setNeedsDisplay:YES genannt verwerfen wollen. Z.B. Manchmal ist es einfacher, alle Unteransichten als Anzeige zu markieren und dann einen Algorithmus auszuführen, um einige davon zu entfernen.

-2

implementieren könnte Wie Sie vielleicht wissen, ist die Aktualisierung der Anzeige erfolgt automatisch (falls erforderlich) bei jeder durch das normale Ereignis passieren Schleife. Sie rufen setNeedsDisplay: auf, um zwischendurch eine Anzeigeaktualisierung zu erzwingen.

Aus der Dokumentation von NSView:

Diskussion
Jedes Mal, wenn die Daten oder Zustand zum Zeichnen einer Ansicht Objektänderungen verwendet wird, sollte die Ansicht eine setNeedsDisplay gesendet werden: Meldung. NSView-Objekte, die als Anzeige markiert sind, werden bei jedem Durchlauf durch die Ereignisschleife der Anwendung automatisch erneut angezeigt. (Objekte anzeigen, die erneut anzuzeigen müssen, bevor die Ereignisschleife herum kommt der kann natürlich sofort die entsprechende Anzeige gesendet werden ... Methode.)

Der boolean Parameter an diese Funktion einfach gibt an, ob sämtliche Grenzen von Die betreffende Ansicht ist betroffen oder nicht, nicht, wenn eine Eigenschaft "needsDisplay" auf "True" oder "False" gesetzt ist. Somit funktioniert setNeedsDisplay: tatsächlich nur wie ein "redrawView", nur mit dem zusätzlichen Parameter.

bearbeiten

Die oben aus der gleichen Dokumentation inspiriert wurde:

Flagge
Wenn JA, markiert die des Empfängers sämtliche Grenzen als Anzeige benötigen; Wenn NEIN, wird es als nicht benötigt angezeigt.

+3

Dies ist weitgehend falsch. Die Ereignisschleife überprüft, ob eine Ansicht neu gezeichnet werden muss, wie durch 'setNeedsDisplay:' bestimmt wurde (sie setzt tatsächlich ein Flag: '- [NSView nearsDisplay]'). Diese Methode verursacht absolut kein sofortiges Neuzeichnen, noch wird jede Ansicht notwendigerweise bei jedem Durchgang neu gezeichnet. Das von Ihnen erwähnte erzwungene Zeichenverhalten wird durch '- [NSView display]' und '- [NSView displayRect:]' bereitgestellt. Siehe http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40002978-CH11-112409 –

+0

Fair genug. Ich habe meine Antwort bearbeitet und erklärt, wo die Informationen herkommen. – Mundi

+1

@Mundi Das beantwortet meine Frage leider nicht genau. Ich frage, ob es eine Verwendung für 'setNeedsDisplay: NO' gibt. – TheAmateurProgrammer

Verwandte Themen