2010-07-17 4 views
6

So beginne ich zu lernen, wie man Kakao verwendet. Ich denke, ich habe es ziemlich gut verstanden, aber ich bin dabei, Ansichten zu erstellen und zu wechseln. Ich überarbeite ein Spiel, das ich vor einiger Zeit zum Üben gemacht habe. Alles, was ich will, ist ein Fenster (vorzugsweise nicht veränderbar) und ich möchte die Ansichten für verschiedene Bildschirme im Spiel wechseln können.Wie wechsle ich Ansichten in einer Cocoa-Anwendung?

Zuerst habe ich das Hauptmenü (Start Spiel, High Scores, Exit). Dann brauche ich für jeden Bildschirm ein Fenster (Gameplay-Bildschirm, Highscore-Bildschirm).

Womit ich verwirrt bin, ist, wie man das gestaltet. Ich habe NSViewController nachgeschlagen, weil ich dachte, dass es Ansichten verwaltet, aber das tut es nicht. Es verwaltet nur eine Ansicht, indem es wirklich geladen wird. Ich verstehe nicht, warum ich dann NSViewController verwenden sollte. Könnte ich nicht einfach eine Fensterklasse haben, die mehrere Unterklassen von NSView enthält und sie so laden? Ich bin mir nicht sicher, ob ich den Zweck des ViewControllers verstehe.

Muss meine Window-Klasse wirklich NSWindowController ableiten? Ich habe versucht, dem Beispiel von Apples ViewController-Beispiel zu folgen, und es hat eine Fenster-Controller-Klasse, die eine Unterklasse von NSWindowController ist. Ich sehe nicht, was der Zweck war, das zu untergliedern. Alle NSWindowController scheint hinzuzufügen ist - initWithPath:(NSString *)newPath, aber ich sehe die Verwendung in diesem entweder nicht, wenn ich nur die PLIST-Datei bearbeiten kann, um das Fenster beim Start zu öffnen. Apples Beispiel hat auch eine NSView-Variable und eine NSViewController-Variable. Brauchen Sie nicht nur eine Variable, um die aktuelle Ansicht zu speichern?

Vielen Dank im Voraus Jungs, ich bin wirklich verwirrt, wie das funktioniert.

Antwort

1

Verwenden folgende Funktionen definiert in UIVew

- (void)addSubview:(UIView *)view 
- (void)removeFromSuperview 
+0

Ich mache gerade Cocoa auf dem Desktop. –

+2

gleiche Schnittstelle verfügbar in Desktop (NSView) –

+0

Also was ich gerne wissen würde, warum sollte ich NSViewController verwenden. Sollte ich? Soll ich eine Unterklasse von NSWindowController mit einer NSView- und NSViewController-Variablen erstellen? Ich bin mir nicht sicher, was wirklich notwendig ist, um ein Fenster mit umschaltbaren Ansichten zu erstellen. Aus meiner Sicht brauche ich NSViewController überhaupt nicht, aber ich weiß es nicht, da das Beispiel von Apple es verwendet hat und es die Dinge für Sie einfacher machen soll. –

5

Sie NSWindowController verwenden (die Teil der vorhandenen Fenster ist) und NSViewController ein Fenster oder eine Ansicht zu verwalten, da Sie nur sollten Subklassen von NSWindow oder NSView erstellen müssen für neue "Arten" von Fenster oder Ansicht. Wenn Sie beispielsweise ein kreisförmiges Fenster verwenden möchten, würden Sie die Unterklasse NSWindow ableiten. Wenn Sie nur Steuerelemente in einem Fenster haben möchten, haben Sie die Unterklasse NSWindowController.

Es ist das gleiche mit NSViewController: Im Allgemeinen eine NSViewController's Ansicht einiger Basisklasse sein wird, wie NSView (oder vielleicht Ihre eigene NSView Unterklasse, die einen benutzerdefinierten Hintergrund zieht). Die NSViewController verwaltet die Interaktion zwischen den Untersichten dieser Ansicht, so dass sie als eine Einheit innerhalb Ihrer größeren Anwendung fungieren kann.

Betrachten Sie es so: Ansichten zeichnen, und sie verwandeln rohe Eingabeereignisse in übergeordnete Aktionen. Controller stellen Informationen für Ansichten bereit und verarbeiten Aktionen.

Wenn Sie Dinge auf diese Weise zusammensetzen, kann die Modularität Ihres Codes erheblich verbessert werden, was das Entwerfen, Schreiben und Debuggen erleichtert.

+0

Ich denke, das macht ein bisschen mehr Sinn. Denkst du, ich müsste 'initWithNibName: bundle:' verwenden, um die Ansicht zu laden, oder kann ich einfach den "Dateibesitzer" der Ansicht auf den ViewController setzen? –

+0

Sie müssen beides tun. Sie verwenden '-initWithNibName: bundle:', um Ihre NSViewController-Unterklasse zu instanziieren. Das lädt die angegebene NIB-Datei und fungiert als deren Eigentümer; Setzen Sie die Klasse des Eigentümers der Datei des Nibs auf Ihre NSViewController-Unterklasse und zeigen Sie die "view" -Ausgabe des Dateibesitzers auf Ihre Ansicht. –

4

Es klingt, als ob Sie versuchen, die Inhaltsansicht innerhalb eines Fensters auszutauschen? Wenn dies der Fall ist, können Sie -[NSView replaceSubview:with:] mit -[NSWindow contentView] als Empfänger verwenden.

Angenommen, Sie haben eine Titelseite mit dem Namen titleView und eine Menüseite mit dem Namen menuView, die Sie im Hauptfenster Ihrer Anwendung ein- und ausblenden möchten.Wenn die Titelseite zu sehen ist und der Benutzer klickt auf einem „Hauptmenü“ Button oder Link, würden Sie so etwas wie dies in der Schaltfläche Delegatmethode setzen:

[[[NSApp mainWindow] contentView] replaceSubview:titleView with:menuView]; 

Zwei Dinge zu beachten:

  1. Die alte Ansicht, titleView, wird in diesem Fall durch diesen Aufruf freigegeben. Wenn Sie möchten, dass es noch verfügbar ist, müssen Sie es vor dem Ersetzen retain ersetzen.
  2. Die übergeordnete Ansicht wird nicht skaliert, wenn Ihre Seiten unterschiedliche Abmessungen haben. Ändern Sie die Rahmengröße des Fensters und damit die contentView ist einfach genug, aber Sie können ein wenig Core-Animation in den Mix hinzufügen, um ihm etwas Stil zu geben.

Ich hoffe, das hilft!

+0

Okay, danke! Ich werde das auch untersuchen. Ihr seid alle sehr hilfsbereit. –

0

Ich bin neu in Kakao, aber ich denke, Ihre App benötigt nicht wirklich einen NSViewController. Ein NSViewController spielt die Rolle des "Controllers" im MVC-Entwurfsmuster. So "steuert" es alle Aktionen - die Leimlogik - in einer einzigen Ansicht.

Zum Beispiel gibt es in einer Ansicht mit mehreren Steuerelementen: Schaltflächen, Tabellen, Kontrollkästchen :, Datumsfelder für Textfelder usw. wahrscheinlich detaillierte Interaktionen zwischen diesen Steuerelementen, die Bindungen und Aktualisierungen erfordern. Zum Beispiel lädt ein Knopfdruck einen Datenbankabruf mit Fehlerbehandlung und Validierung. Diese Glue-Logik wird in die NSViewController-Klasse eingefügt.

In Ihrer App klingt es so, als ob jede Ansicht eine einfache Seite ist, die wenig Kontrolle über die Ansichtsebene erfordert. So benötigen Sie wahrscheinlich einen einzelnen NSWindowController, einen Controller für die Logik und Ereignisse für den Übergang von einer Seite zur anderen.

Eine Technik zum Behandeln mehrerer Ansichten, die ein einzelnes Fenster ausfüllen, ist die Verwendung einer NSTabView und das Festlegen des Tabstyle auf "randlos" in IB. Wählen Sie dann mit der Tastenaktion das gewünschte NSTabViewItem aus. Legen Sie während der Entwicklung den Tabview-Stil auf "Obere Registerkarten" fest, und IB ermöglicht Ihnen, durch die Unteransichten zu navigieren, die Sie anzeigen möchten.