Wie erstellt Xcode eine dokumentenbasierte Anwendung?

8

Ich lerne Cocoa und mein Verständnis aus dem Lesen der Dokumentation ist, dass wenn eine Anwendung startet das folgende passiert:

  1. Eine gemeinsam genutzte Anwendungsinstanz wird erstellt.
  2. Die Haupt-Nib-Datei wird aus der Anwendungseigenschaftsliste nachgeschlagen, so dass die Anwendung weiß, welche Nib geladen werden soll.
  3. Die Laufschleife wird gestartet.

Das ist gut und sinnvoll für s single windowed Anwendung, aber ich bin verwirrt, was xcode tut, wenn eine dokumentbasierte Anwendung erstellt wird.

In diesem Fall gibt es zwei Nib-Dateien; Das erste enthält das Anwendungsmenü und das zweite enthält das Fenster, das die Unterklasse NSDocument darstellt. Wenn ich die Anwendung starte, wird automatisch ein neues Dokumentfenster geöffnet.

Aufgrund meines Verständnisses, wie die Anwendung oben beschrieben funktioniert, verstehe ich nicht, wie meine Anwendung das Dokumentfenster zu öffnen weiß, sobald die Menüspitze aus der Eigenschaftsliste nachgeschlagen wurde. Soweit ich es sehen kann, wird dafür kein Code generiert (außer für die windowNibName -Methode, aber wo wird diese aufgerufen?)

Kann mir jemand sagen, was xcode anders macht, damit die Anwendung weiß, dass es dokumentenbasiert ist und daher ein Dokumentfenster öffnen muss?

Aktualisierung:

Was ich versuche zu verstehen, ist, wie Xcode weiß, wie man etwas anders macht, wenn meine Anwendung als eine dokumentenbasierte Anwendung und nicht als eine einzelne Fensteranwendung eingerichtet wird. Soweit ich weiß, gibt es keine Einstellung, um dies zu spezifizieren, und Xcode scheint keinen Code zu erzeugen, der dieses unterschiedliche Verhalten hervorruft.

Aus dem Lesen der Dokumente der letzten Tage denke ich Ich weiß, wie das funktioniert, bin mir aber nicht sicher:

  1. _NSApplication_hat eine delegate-Methode applicationOpensUntitledFile , die vom Anwendungsdelegaten aufgerufen wird.
  2. NSDocumentController wird standardmäßig als Anwendungsdelegat festgelegt, und die Standardimplementierung sucht nach dem Vorhandensein der CFBundledTypeInfo , um festzustellen, ob das Dokument dokumentbasiert ist oder nicht und entsprechend reagiert die Anwendung (IE YES für dokumentbasierte Anwendung und NEIN für einzelne Fensteranwendungen).
  3. Wenn eine einzelne Fensteranwendung erstellt wird, wird der Anwendungsdelegate meistens durch einen benutzerdefinierten AppController ersetzt, der normalerweise keine Definition für die Methode applicationOpenUntitledFile enthält es ist nicht für die Art der Anwendung geeignet.

Hoffentlich können alle Cocoa-Experten bestätigen, ob mein Verständnis stimmt oder ob ich den falschen Baum anbreche.

    
Benjamin Gale 26.06.2011, 19:09
quelle

3 Antworten

5

Wenn Sie eine dokumentbasierte Anwendung erstellen, erhalten Sie einige Dinge:

  • Eine Unterklasse von NSDocument
  • Eine neue XIB-Datei für dieses Dokument, zusätzlich zu MainMenu.xib
  • Ein CFBundleDocumentTypes-Eintrag in Info.plist, der die App über Ihre NSDocument-Unterklasse
  • informiert

Wenn Ihre App geöffnet wird, erstellt der freigegebene NSDocumentController ein neues Dokument ohne Titel mit den CFBundleDocumentTypes-Informationen.

Weitere Informationen finden Sie unter Die dokumentbasierte Anwendungsprojektvorlage und der Rest des dokumentenbasierten Anwendungsleitfadens.

    
jtbandes 26.06.2011, 19:17
quelle
0

Ich nehme dein Recht an. Wenn Sie eine nicht-basierte Dokumentanwendung erstellen, fügen Sie die Dokumenttypinformationen in der -Info.plist hinzu und legen Sie den Delegaten von NSApplication in der Datei main.m wie folgt fest

%Vor%

Das Verhalten scheint mit der standardmäßigen dokumentenbasierten Anwendungsvorlage identisch zu sein.

    
yageek 09.12.2013 10:52
quelle
0

Nein, Ihre Annahme stimmt nicht, schauen Sie sich die Implementierung der GNUstep-Version in der finishLaunching-Methode von NSApplication an:

%Vor%

So wird automatisch eine Instanz von NSDocumentController erstellt.

    
freedostudio 10.07.2014 08:22
quelle

Tags und Links