Frage

Dies scheint, wie es einfach noch sein sollte, muss ich etwas fehlen. Ich habe ein Dokument-basierte Anwendung. Ich habe auch eine neue XIB gebaut, die eine NSTableView und drei Tasten auf sie hat, dass ich eine Liste der vorherigen Dateien anzuzeigen beabsichtigen. Ich wünschte, das XIB erste beginnt anstelle des Dokumentfensters, wenn die Anwendung angezeigt werden. Sobald der Benutzer wählt eine alte Datei oder trifft auf die Schaltfläche „Neu“ Ich möchte dann in das Dokumentfenster gehen. Dies ist sehr häufig, und ich habe oft gesehen verwendet.

In meinen Versuchen, diese Funktion zu erhalten Ich habe das Projekt-info.plist Datei geändert und die Haupt NIB Datei-Basisname von MyDocument meiner Auswahl XIB Namen geändert. Dies bewirkt, dass die Anwendung des Auswahlfenster angezeigt werden, anstatt die MyDocument Fenster. Es scheint zu diesem Punkt kein Problem sein wird.

In meinem Auswahlfenster Ich habe meine Tabellenansicht und einen Array-Controller und eine benutzerdefinierte Fenstersteuerung nur für diesen XIB einrichten. Ich habe die Datei Besitzer zu dem neuen Fenster Controller eingestellt und die Fenstersteuerung Fenster Eigenschaft auf die Fenster und das Fenster des Delegierten-Eigenschaft auf die Datei Besitzer sowie die „Select“, „Abbrechen“ und „Neu“ Tasten gebunden. Nichts wird dem NSApplication gebunden. Aber das Merkwürdige ist, wenn ich laufe diese Anwendung es diese Controller zu NSApplication mit dem Fehler (gleiche gilt für die beiden anderen Tasten) zu verbinden scheint zu wollen:

Könnte die Aktion SELECT, nicht anschließen: an Ziel der Klasse NSApplication

Es zeigt auch einen Fehler, dass NSApplication nicht Schlüsselwert-konform für den Auslass, den Verweis auf meine Anordnung hält. Die Array-Controller, Fenster und Tasten sind nicht zu NSApplication aber auf den neuen Fenster-Controller gebunden. Ich hätte erwartet, dass, wenn es irgendein Problem war ist, würde NSApplication nicht erwähnt, sondern die Fenstersteuerung, an die die Steuerungen gebunden sind.

Wer weiß, was hier geschieht? Ist das ein Ziel-Action-Problem, weil ich die „Haupt NIB Datei-Basisname“ vom „Hauptmenü“ auf „Auswahl“ geändert? Wenn ich nicht angenommen werde, dies zu ändern, wie kann ich dann bekommen Cocoa ich erlauben, bevor zeigen das Dokumentfenster einen Auswahlbildschirm angezeigt werden?

Jede Hilfe wird sehr geschätzt. Rob

War es hilfreich?

Lösung

Die Einstellung in IB für die Klasse des Besitzers der Spitze der Datei ist nur beratende; es läßt IB zeigt nur die Auslässe und Aktionen, die von Instanzen dieser Klasse vorgesehen sind. Es erzwingt nicht, dass die Besitzer der Datei wird eine Instanz dieser Klasse sein, da die Datei Besitzer nicht Teil der Feder ist.

Die Besitzer der Datei ist das Objekt, lädt die Spitze. Diese notwendigerweise bedeutet, dass es außerhalb der Spitze ist, und nichts in der Spitze bestimmt etwas dagegen. Im Fall der MainMenu nib, seine Datei Besitzer-das Objekt, lädt die MainMenu nib-ist NSApplication Instanz. Also, alles, was Sie in die Datei Besitzer in Ihrem MainMenu nib angeschlossen, hakt Sie auf das Anwendungsobjekt auf, obwohl Sie IB gesagt, dass es nicht die Anwendung sei.

Dass die Anwendung ist der Eigentümer der MainMenu nib-unabhängig davon, was Sie sagen, IB-ist nicht der Fehler. Die Anwendung ist immer der Besitzer der MainMenu nib. Das ist normal und richtig; Sie können es nicht ändern, sollte es nicht zu ändern versuchen, und nicht brauchen, es zu ändern.

Der Fehler, auf den Punkt gebracht, ist, dass man eine Nase für zwei sehr unterschiedliche Zwecke verwenden.

Sie sollten die MainMenu lassen nib sein, dass allein enthaltende nur die MainMenu, Ihre benutzerdefinierten Dokumentsteuerung (ich in einem Moment, dass bekommen), und AppDelegate-und die vorherigen Dokumente Fenster in eine separate Feder bewegen , durch die vorherigen Dokumente Fenster Controller gehört. Um eine Fenstersteuerung sein der Eigentümer dieser Feder zu haben, müssen Sie es die Fenster Controller Last haben. Sie müssen, dass in tun Code Sie nicht, dass bis in IB oder in einer plist einstellen können.

In Ihrer Anwendung delegiert, instantiate und besitzt die Fenstersteuerung. Es klingt wie Sie eine benutzerdefinierte NSWindowController Unterklasse gemacht, so dass Sie seine init außer Kraft setzen können, um es selbst zu Last der initWithWindowNibName: Nachricht senden zu haben und die Spitze besitzen. Dann nutzen Sie einfach alloc und init das Fenster Controller aus dem AppDelegate zu erstellen.

Das wird die Beseitigung der Konsolenmeldung erhalten, und dafür sorgen, dass die Tasten tatsächlich auf die Fenstersteuerung (weil sie süchtig bis zu der Datei Besitzer, die mit dieser Änderung werden die Fenstersteuerung sein) angeschlossen.

Haben AppDelegate reagieren auf applicationOpenUntitledFile: durch die Fenstersteuerung der showWindow: Nachricht sendet. Dies wird die vorherige-Dokumente Fenster erscheinen jederzeit macht den Benutzer normalerweise ein neues Dokument erstellt haben würde.

Wenn Sie die üblichen Methoden der Erstellung von Dokumenten unterstützen wollen (das heißt, erlauben Neues Dokument zu arbeiten), implementieren dann applicationDidFinishLaunching: und applicationShouldHandleReopen:hasVisibleWindows:, nicht applicationOpenUntitledFile:. Achten Sie darauf, keine Dokumente geöffnet sind, und zeigen Sie Ihre Fenster, wenn das der Fall ist.

Sie sollten auch eine benutzerdefinierte Unterklasse von NSDocumentController machen und Ihr Dokument Controller eine Instanz, dass machen, und in dieser Klasse implementieren addDocument: und removeDocument: zur Wieder zeigen die vorherigen Dokumente Fenster, wenn das zuletzt geöffnete Dokument geschlossen wird, und sich zu verstecken es, wenn ein Dokument geöffnet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top