Ich habe NSWindowController in mehreren Projekten verwendet und habe das Gefühl, dass ich ein (sehr) grobes Verständnis der Konzepte hinter dieser wichtigen Klasse habe. Was ich mit diesem Beitrag erreichen möchte, ist meine eigenen Erkenntnisse zu klären/korrigieren und hoffentlich anderen Lernenden zu helfen, den ersten Schritt zum Verständnis zu machen. Es sind die auf einen Blick Konzepte, Übersichten und bewährten Verfahren, die ich am nützlichsten finde und die in der Dokumentation oft fehlen. Hier ist meine Ansicht zu NSWindowController (Fragen sind fett hervorgehoben):
- Ein NSWindowController (NSWC) Unterklasse existiert (konzeptionell) direkt unter jedem Fenster-Nib und fungiert als Bindeglied zwischen den Benutzeroberflächenelementen und den Modellobjekten, die sie steuern/darstellen. Grundsätzlich sollte jedes Fenster in Ihrer Anwendung eine eigene NSWC Unterklasse haben.
- Der File's Owner des Nibs sollte immer die NSWC Unterklasse sein. Ist dies auch der Fall für die MainMenu.xib Anwendung?
- Das NSWC
window
Eigenschaft sollte immer mit dem NSWindow in InterfaceBuilder verknüpft sein. - Sie sollten die 'init' Methode überschreiben und
[super initWithWindowNibName:]
verwenden, damit beim Verweisen auf[mycontroller window]
das Nib geladen wird. Sollte dies auch für den NSWC für das MainMenu.xib Fenster der Fall sein, obwohl dies beim Start geöffnet wird? - Der NSWC sollte nicht zu viele Aufgaben übernehmen - er sollte einfach Nachrichten an Instanzen von Objekten übergeben und diese Objekte in der Benutzeroberfläche präsentieren.
- Es kann die Benutzeroberfläche über Bindung modifizieren, als Delegierter für Tabellen fungieren usw. oder aktiv die Benutzeroberflächenelemente ändern, wenn es eine Änderung beobachtet, oder eine Kombination aus all dem (welche Methode Sie verwenden, scheint eine Frage des Geschmacks zu sein, mit Vor- und Nachteilen auf allen Seiten).
- Ein NSWC kann bei Bedarf Instanzen anderer NSWCs erstellen (zum Beispiel beim Öffnen eines einmaligen Unterfensters).
-
Verwenden Sie
[mycontroller showWindow:nil]
, um das zugehörige Fenster vorne anzuzeigen. Wenn Sie möchten, dass das Fenster als Blatt erscheint, verwenden Sie etwas wie:NSWindowController* mycontroller = [[MyController alloc] init]; [NSApp beginSheet: [mycontroller window] modalForWindow: [self window] modalDelegate: self didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:) contextInfo: nil];
Das didEndSelector:
sollte eine Methode des NSWC des übergeordneten Fensters sein und kann auf 'mycontroller' mit [sheet windowController]
performClose: des NSWC-Fensters auf.
Einige Fragen:
- Sollte der NSWC des MainMenu-Fensters auch der Anwendungsdelegierte sein oder sollte dies eine andere Klasse sein?
- In gleicher Weise, sollte der Haupt-NSWC Dateien (Drag & Drop und Öffnen) bearbeiten oder sollte dies an den Anwendungsdelegierten weitergeleitet werden, oder ist das nur eine Frage des Geschmacks?
Bitte korrigieren Sie mich, wenn etwas davon schlechte Praxis ist oder einfach falsch. Ich möchte mein Verständnis von NSWindowController klären, daher wären alle Ergänzungen (in Form von bewährten Verfahren, Erfahrungen, Vorsichtsmaßnahmen) sehr willkommen.
Vielen Dank, Laurie