Ich habe eine dokumentbasierte Anwendung. Ich habe gerade Menüpunkte im Storyboard und IBActions in meinem View-Controller erstellt. Die übliche Art, wie ich eine Aktion mit einem Ziel verbinde, funktioniert jedoch nicht
%Vor%Hier ist, was ich sehe, wenn ich von meinem Menüpunkt aus die Strg-Taste drücke und mit der Maus vom Menü zum View-Controller klicke. Es zeigt nicht meine IBActions.
Irgendeine Idee? Meine 2 Cent Schätzung ist, dass es damit zu tun hat, dass die App dokumentenbasiert ist, aber ... nicht wirklich sicher ist.
Warum kann ich mein Menü nicht mit meinem View-Controller IBAction verbinden?
Da sich Ihre Menüelemente und der Ansichtscontroller in verschiedenen Szenen im Storyboard befinden. Sie können sich eine Szene als unabhängiges Diagramm von Objekten vorstellen, die beim Laden der Szene aus dem Storyboard instanziiert werden. Objekte in verschiedenen Szenen können im Storyboard nicht miteinander verbunden werden, da sie nicht gleichzeitig geladen werden.
Versuchen Sie nur zum Spaß, eine Instanz Ihres View-Controllers in der Anwendungsszene in Ihrem Storyboard zu erstellen. Um dies zu tun, müssen Sie wahrscheinlich eine einfache alte NSObject
-Instanz in die Szene ziehen und dann ihren Typ festlegen. Sobald Sie das getan haben, werden Sie feststellen, dass Sie eine Verbindung von einem Menüelement zu diesem Ansichtscontroller genau so ziehen können, wie Sie es erwarten würden, aber Sie können eine Verbindung nicht auf ein anderes Objekt des gleichen Typs in einem anderen ziehen Szene.
Hinweis: Wenn Sie genug Erfahrung gesammelt haben, um sich davon zu überzeugen, dass es funktioniert, denken Sie daran, den von Ihnen hinzugefügten View-Controller zu löschen. Ein View-Controller ohne View ist wie eine Ente ohne Quacksalber, und ein View-Controller und seine View-Hierarchie sollten sich in einer eigenen Szene befinden.
Meine Schätzung von 2 Cent ist, dass es damit zu tun hat, dass die App dokumentenbasiert ist
Nein, damit hat es nichts zu tun. Sie hätten das gleiche Problem in einer App, die nicht dokumentenbasiert ist. Sie hätten auch das gleiche Problem, wenn Ihre App .xib-basiert wäre, anstatt Storyboards zu verwenden, da sich der Controller, mit dem Sie eine Verbindung herstellen möchten, in einer komplett anderen .xib-Datei befindet.
Die einfache Lösung, wie bereits von Mark beschrieben, ist die Verwendung der Responder-Kette. Das Proxy-Objekt First Responder ist Teil jeder Szene, sodass Sie immer Verbindungen zu ihm herstellen können. Wenn Sie einen Menüeintrag mit First Responder verbinden, lautet sein Ziel nil
, wodurch NSMenu
angewiesen wird, die Responderkette zu durchlaufen, bis ein Objekt gefunden wird, das auf die Aktionsnachricht des Menüelements reagiert. Es sendet dann die Nachricht an das Objekt.
Verbinden Sie die Menüelemente mit dem First Responder der Anwendungsszene. Wenn Sie eine Verbindung zum First Responder der Anwendungsszene herstellen, sollten die IBActions Ihres Ansichtscontrollers in der Liste der verfügbaren Aktionen des HUD anstelle der in der HUD Ihres Screenshots angezeigten Aktionssegmente angezeigt werden.
Wenn Sie ein Projekt von Ziel C nach Swift konvertieren, machen Sie keinen Fehler. Schreiben Sie beim Schreiben Ihrer IBAction wie folgt:
%Vor% Lassen Sie den Unterstrich vor sender
nicht aus, da der Interface Builder keine Verbindung zu Ihrer Aktion wie hier herstellen kann:
Tags und Links xcode cocoa nsstoryboard