NSWindowController Klärung des Verständnisses
Habe ich verwendet NSWindowController in Projekten mehrere Male und fühle mich wie ich haben eine (sehr)groben Einblick in die Konzepte, die hinter dieser wichtigen Klasse. Was möchte ich mit diesem post zu tun, ist zu klären/korrigieren meinem eigenen Verständnis, und hoffentlich helfen Sie anderen Lernenden bekommen, dass der erste Schritt zum Verständnis. Es ist die auf einen Blick Konzepte, überblick und best practices, die ich finden ist äußerst nützlich, und oft fehlen in der Dokumentation. Hier ist mein nehmen auf NSWindowController (Fragen eingestreut sind Fett hervorgehoben):
- Eine NSWindowController (NSWC) Unterklasse vorhanden ist (begrifflich) nur unter jedem Fenster-Feder, die als Kleber zwischen die Elemente der Benutzeroberfläche und den Modell-Objekten, die Sie Steuern/darstellen. Im Grunde, jedes Fenster in Ihrer Anwendung sollte mit einem eigenen NSWC Unterklasse.
- Der File ' s Owner der nib-sollte immer die NSWC-Unterklasse. Ist dies der Fall, auch für das Hauptmenü.xib-Anwendung?
- Die NSWC
window
Eigenschaft sollte immer im Zusammenhang mit der NSWindow im InterfaceBuilder. - Sollten Sie überschreiben der "init" - Methode, mit
[super initWithWindowNibName:]
, so dass, wenn Sie beziehen sich auf[mycontroller window]
es wird das laden der nib. Sollte dies auch der Fall für die NSWC für das MainMenu.xib-Fenster, obwohl dieses beim Start geöffnet? - Die NSWC sollte nicht zu viel zu tun schweres heben - es sollte einfach passieren Nachrichten an Instanzen der Objekte, und diese Objekte in der Benutzeroberfläche.
- Es kann ändern Sie die Benutzeroberfläche mit Bindung, oder die Tätigkeit als Delegierter für die Tabellen etc., oder indem Sie selbst aktiv die änderung der UI-Elemente, wenn es beobachtet, eine änderung oder eine Kombination von einer der oben genannten (welche Sie verwenden, zu sein scheint eine Frage des Geschmacks, mit vor-und Nachteile auf allen Seiten).
- Eine NSWC können erstellen von Instanzen anderer NSWCs, wenn nötig (beispielsweise, wenn die Eröffnung eines "one-off" sub-Fenster).
-
Verwenden Sie die
[mycontroller showWindow:nil]
- display, um die zugehörigen Fenster an der Vorderseite. Wenn Sie möchten, dass das Fenster zu erscheinen, wie ein Blatt, verwenden Sie so etwas wie:NSWindowController* mycontroller = [[MyController alloc] init]; [NSApp beginSheet: [mycontroller window] modalForWindow: [self window] modalDelegate: self didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:) contextInfo: nil];
Den didEndSelector:
sollte eine Methode des NSWC des übergeordneten Fensters, und können den Zugriff und Veröffentlichung 'mycontroller' mit [sheet windowController]
.
- Schließen Sie das Fenster durch Aufruf der performClose:
Methode der NSWC-Fenster.
Einige Fragen:
- Sollte die NSWC des Hauptmenü-Fensters auch die Anwendung delegieren, oder sollte das eine andere Klasse?
- In die gleiche Richtung, sollten die wichtigsten NSWC-handle-Dateien (drag/drop und Eröffnung), oder sollte es weitergegeben werden, um die app zu delegieren, oder ist das nur eine Frage des Geschmacks?
Bitte korrigieren Sie mich, ist dies eine schlechte Praxis, oder ist schlicht und einfach falsch. Ich bin auf der Suche um zu klären, mein Verständnis von NSWindowController, also Ergänzungen (in form von best practices, Erfahrungen, Fallstricke) würde sehr geschätzt werden.
Dank,
Laurie
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was sind Fenster Controller eigentlich?
Fenster Controller-tools zu laden ein Fenster aus einer NIB-Datei und für die Verwaltung des Speichers der zugewiesenen Ressourcen in die Spitze. Vor dort, wo
NSWindowControllers
man grundsätzlich schreiben musste, den gleichen code für jedes Fenster oder erfinden ein eigenes Fenster controller-Klasse.Natürlich sind Sie auch Controller in der Model/View/Controller Sinn, Sie sind also der richtige Ort, um zu verbinden, die Aussicht aus dem Fenster, um die Modell-Objekte. Dies tun Sie oft so tun müssen, als die Delegaten oder die Datenquelle für ein view-Objekt. Du hast also dieses Teil vollkommen Recht.
Auch window-Controller sind ein Werkzeug für die Wiederverwendung von code. Es macht es einfach zu löschen das Fenster " controller-Klasse und es XIB/NIB in ein anderes Projekt und dort verwenden.
Also ja, jedes Fenster von einer Feder sollte sein Eigentum durch eine Fenster-Steuerung, mit einer Ausnahme. Eigentlich ist dies nur eine Richtlinie für guten Quellcode, nichts erzwingt es.
WindowControllers und MainMenu.xib
MainMenu.xib
ist eine andere Sache, da Sie nicht verwenden können, ein Fenster controller. Diese Feder wird geladenNSApplication
so dieser hat zu sein, es ist "Files owner". Es gibt keine Möglichkeit, ein Fenster controller zwischen denNSApplication
und die NIB. Es ist auch nicht notwendig, verwenden Sie ein Fenster, controller für die Speicherverwaltung, weil das application-Objekt das Leben für die gesamte Laufzeit des Programms, damit es nicht zu bereinigen, die it-Ressourcen aus der Spitze, wenn es wird die Zuordnung aufgehoben.Wenn Sie wirklich brauchen ein Fenster, controller für das Hauptfenster können Sie nicht setzen Sie diese in die
MainMenu.xib
.Ich hoffe, das hilft. Es gibt sicherlich eine Menge mehr zu sagen über das Controller-Fenster zu
Nein, die MainMenu-Feder ist im Besitz von NSApplication (das ist, wer geladen wird).
Nein, NSApplication, lädt der main-Spitze, basierend auf Ihren Anwendungen, Datei "NSMainNibFile" - Eigenschaft. (Es passiert einfach bei der Voreinstellung "MainMenu" in der Vorlage Xcode-Projekte.) Wenn Sie möchten, ändern Sie den Namen dann ändern Sie es dort (und benennen Sie Ihre nib-Datei). (BTW: Diese Eigenschaft kann auch geändert werden in Ihrem Ziel, die "Zusammenfassung" - Ansicht in Xcode 4.)
Den Besitzer der NSMainNibFile Feder ist die Instanz von NSApplication, lädt es und von Vereins alle Delegierten dieser Instanz. Weder von diesen sind NSWC sub-Klassen.
Gibt es keine "main NSWC" (Die app/app-delegate ist der controller für die NSMainNibFile).
Alle drag-n-drop-Operationen gehandhabt werden, von NSWindow oder NSView sub-Klassen. Normalerweise verwende ich eine spezielle NSWindow oder NSView sub-Klasse, passt einfach alles per drag-n-drop-Methoden durch, um den Delegierten. Zum Beispiel:
Diese Weise kann ich alle meine Fenster/anzeigen-code zusammen, die in Ihren jeweiligen controller (wie entschlossen, durch Ihre nib-Besitzer). Und da die Fenster/anzeigen-spezifische code wird in die Steuerung (nicht das NSWindow/NSView subclass) verschiedene Arten von NSWindows/NSViews können alle verwenden die gleichen drag-n-drop sub-Klassen.