Konvertieren einer grundlegenden Cocoa-Anwendung in eine dokumentenbasierte Anwendung

9

Mein Team und ich haben an einer bestehenden, nicht dokumentbasierten Cocoa-Anwendung gearbeitet. Dies ist unsere erste Cocoa-App, obwohl wir bisher eine Reihe von iOS-Apps erstellt haben.

Die App sollte jedoch wirklich dokumentbasiert sein, also habe ich angefangen, sie zu konvertieren. Aber Dinge hier & amp; es scheint nicht zu funktionieren. Zum Beispiel die Datei - & gt; Der geöffnete Menüpunkt ist permanent deaktiviert (obwohl ich den Menüpunkt "Datei - & gt; Speichern" endlich aktiviert hatte; anfangs nicht). Außerdem kann ich auf das rote X klicken, um ein Fenster zu schließen, obwohl die Datei - & gt; Der Menüeintrag selbst ist deaktiviert. Wenn ich das Fenster jedoch über die X-Schaltfläche schließe, wird die Dealloc-Methode in meiner NSDocument-Implementierung (SPDocumentInfo) nicht aufgerufen. Ich habe eine Probe, brandneue dokumentbasierte App nur für Vergleiche erstellt; wenn ich dort ein Fenster schließe, wird die Dealloc-Methode der SPDocument-Implementierung tatsächlich aufgerufen (wie ich es erwarten würde.) Das betrifft mich also.

Ich habe hier und da viel an dem Projekt geändert; Dazu gehören:

  • Made SPDocumentInfo erweitern SPDocument wie in der .h-Datei:

    %Vor%
  • In SPDocumentInfo wurde Folgendes implementiert:

    %Vor%
  • Bearbeitete die .plist-Datei, um "Dokumenttypen" hinzuzufügen. Unter anderem definiert "Cocoa NSDocument Class"="SPDocumentInfo".

  • In SPDocumentInfo wurden einige Verbindungen geändert, um den Verbindungen in der Beispielanwendung auf Dokumentbasis zu entsprechen. In SPDocument.nib ist beispielsweise der Eigentümer der Datei (der für SPDocumentInfo steht) der Delegat des Fensters.

Ich frage mich also, ob es noch andere Dinge gibt, die mir bei der Konvertierung in eine doc-basierte App fehlen. Oder gibt es Anleitungen, wie man das macht? (Ich habe gesucht, konnte aber keine finden). Oder sollte ich einfach mit einer neuen dokumentenbasierten App anfangen und versuchen, all unsere Sachen nachzurüsten? Hat jemand überhaupt irgendwelche Erfahrungen damit?

    
Dave Taubler 23.02.2011, 22:03
quelle

3 Antworten

2

Dies ist eher eine Meinung als eine direkte Antwort, aber wenn Sie neu auf der Mac-Seite und auf dokumentenbasierten Anwendungen sind, wäre Ihr Weg des geringsten Widerstandes definitiv ein neues doc-basiertes Xcode-Projekt von der template und verschieben Sie den entsprechenden Code und schließen Sie ihn an den gewünschten Stellen an.

    
Joshua Nozzi 23.02.2011 23:59
quelle
1

Okay, diesmal habe ich legitim eine Lösung zu präsentieren.

Es stellte sich heraus, dass ich eine "window" -Instanzvariable in SPDocumentInfo hatte (die, wie Sie vermuten, auf das NSWindow verweist, das dem Dokument zugeordnet ist). Dies schien eine Kette von Ereignissen zu verursachen (oder wahrscheinlicher, verhinderte eine Kette von Ereignissen), die dazu führten, dass SPDocumentInfo dealloc nicht aufgerufen wurde, als es sein sollte. Ich habe das nicht bemerkt, als ich mein Projekt mit dem Beispielprojekt auf Doc-Basis verglichen habe, weil SPDocument auch eine Membervariable namens "window" hat, die auch ist zum relevanten NSWindow. Ich sah diese Verbindung im Beispielprojekt und es sah identisch mit der Verbindung meines Projekts aus, also habe ich nicht lange darüber nachgedacht.

Mit anderen Worten, ein Teil meines Problems war, dass ich zufällig entschied, eine NSDocument-Implementierung eines "Fenster" -Ausgangs anzuschließen, und nicht bemerkte, dass ich tatsächlich eine Superklassenvariable überschattete (was ich vermute, im Gegensatz zu meins, konfiguriert als "zuweisen" und nicht "behalten").

An diesem Punkt scheinen die Dinge also in Ordnung zu sein, und ich denke, ich kann erklären, dass es tatsächlich möglich ist (und mein lästiges Problem, im Allgemeinen schmerzlos), von einer nicht-doc-basierten App zu einer doc-basierten zu konvertieren.

    
Dave Taubler 25.02.2011 22:51
quelle
0

Ein häufig gefundener Vorschlag besteht darin, eine neue dokumentenbasierte Anwendung zu erstellen und den vorhandenen Code dorthin zu verschieben. Dies kann für einen großen Arbeitsbereich mit allen Arten von Sachen, die gut konfiguriert sind, mühsam sein. Ganz zu schweigen von der Versionskontrolle.

Ich habe die folgenden einfachen Schritte gemacht und es hat funktioniert:

  • Erstellen Sie eine dokumentenbasierte Anwendung
  • Kopieren Sie aus diesem generierten Projekt den folgenden Abschnitt aus der Info.plist (öffnen Sie die Datei mit einem normalen Texteditor):

    %Vor%

    und fügen Sie es in die Datei Info.plist in Ihrem eigenen Projekt ein.

  • Kopieren Sie Document.swift aus dem generierten dokumentbasierten Projekt in Ihr eigenes Projekt.

  • es enthält eine Methode:

    %Vor%

    Erzeugt ein neues Fenster genau so, wie Sie es normalerweise tun würden. Wenn Ihr Storyboard nur einen Fenstercontroller hat, kann das 'withIdentifier'-Feld etwas Willkürliches enthalten. Wenn in Ihrem Storyboard mehr Fenstercontroller vorhanden sind, muss der Bezeichner mit dem rechten Fenstercontroller für neue Dokumente übereinstimmen.

Hans 12.07.2017 09:36
quelle

Tags und Links