2015-02-22 3 views
7

Ich habe eine Dokument basierte Anwendung. Ich habe gerade Menüpunkte im Storyboard und IBActions in meinem View-Controller erstellt. Doch die übliche Art, wie ich eine Aktion zu einem Ziel verbinden funktioniert nichtWarum kann ich mein Menü nicht mit meinem View Controller IBAction verbinden?

-(IBAction) markAsHidden:(id)sender; 
-(IBAction) markAsVisible:(id)sender; 
-(IBAction) toggleHidden:(id)sender; 

Hier ist, was ich sehe, wenn von meinem Menüpunkt I drücken Sie Strg und Mausklick aus dem Menü-Controller anzuzeigen. Es zeigt nicht meine IBActions.

Irgendeine Idee? Meine 2 Cent Vermutung ist, dass es mit der App sein Dokument zu tun hat, basiert aber ... nicht wirklich sicher,

connection menu

+0

immer Sie Wenn Sie die Verbindung herstellen, denkt Xcode, dass Sie die Aktion verwenden möchten, um zu einem anderen Controller zu wechseln. Können Sie Ihren Menüeintrag auswählen und ihn dann durch Ziehen aus dem Verbindungseditor (rechter Bildschirmbereich) verbinden? –

+0

@PhillipMills Ich habe das auch versucht (von Gesendete Aktionen -> Selektor) zu View Controller, aber das gleiche Ergebnis – Thomas

+0

@Thomas Werden Ihre IBActions im HUD angezeigt, wenn Sie eine Verbindung zum First Responder der Anwendungsszene herstellen? Durch die Verbindung mit dem First Responder der Anwendungsszene konnte ich Menüelemente mit IBActions in meinen View-Controllern verbinden. –

Antwort

9

Warum kann ich mein Menü nicht mit meinem View Controller IBAction verbinden?

Da Ihre Menüpunkte und View-Controller in verschiedenen Szenen sind im Storyboard. 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.

Nur zum Spaß, erstellen Sie eine Instanz Ihres View-Controllers in der Anwendungsszene in Ihrem Storyboard. 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: Sobald Sie genügend 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 2 Cent Vermutung ist, dass es mit der App sein Dokument

Nein, hat es nichts damit zu tun Basis zu tun hat. 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 völlig anderen .xib-Datei befindet.

Die einfache Lösung, wie bereits von Mark beschrieben, ist die Responder-Kette. Die First Responder Proxy-Objekt ist Teil jeder Szene, so dass 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 Antwortkette zu durchlaufen, bis ein Objekt gefunden wird, das auf die Aktionsnachricht des Menüelements reagiert. Es sendet dann die Nachricht an dieses Objekt.

+1

Nur um klar zu sein, eine Instanz Ihrer View-Controller-Klasse in der Anwendungsszene zu platzieren, ist interessant, um zu zeigen, dass das Problem eine Verbindung zwischen Szenen ist, ** aber ** sollte nicht dort belassen werden. Es wird nicht so funktionieren, wie OP es wünscht, und es wird aufgrund des Streuners, der nicht mit View-Controllern verbunden ist, zu Verwirrung führen. –

+0

@KenThomases ** Richtig! ** Ich stimme absolut zu. Ich wollte nur das Problem illustrieren, nicht vorschlagen, dass das OP versucht, eine echte App mit einem View-Controller in der Anwendungsszene zu bauen. Ich werde aktualisieren. – Caleb

+0

danke für die ausführliche Antwort. Was ist die Kette von First Responder in einer Szene? Anwendungsszene -> Controller-Szene anzeigen (= unser View-Controller, standardmäßig)? – Thomas

16

die Elemente Menü Verbindung mit der Anwendung Szene First Responder. Wenn Sie eine Verbindung zum First Responder der Anwendungsszene herstellen, sollten die IBActions Ihres View-Controllers in der Liste der verfügbaren Aktionen des HUD anstelle der in der HUD Ihres Screenshots angezeigten Aktionssegmente angezeigt werden.

+0

Ich habe nicht akzeptiert, weil in der Zwischenzeit gab es eine weitere Antwort ausführlicher (Entschuldigung), also habe ich Sie upboed, um das zu kompensieren – Thomas

+0

Es funktioniert, aber mein Menü ist immer grau ... –

+0

@MartinDelille Überprüfen Sie die Verbindungen. Eine weitere Sache, die Sie in Ihren Code einchecken, sind die Namen Ihrer Aktionen. Wenn ein Rechtschreibfehler vorliegt, ist das Menü möglicherweise deaktiviert. Ich hatte kürzlich ein Problem, bei dem ein Menü deaktiviert wurde, weil ich am Ende des Aktionsnamens in meinem Code einen Doppelpunkt verpasste. Wenn das nicht hilft, stellen Sie eine neue Frage. –

2

Wenn Sie ein Projekt von Ziel C nach Swift konvertieren, machen Sie keinen Fehler.Wenn Ihr IBAction Schreiben wie folgt schreiben:

@IBAction func someAction(_ sender:AnyObject) { 
    // this will work 
} 

den Unterstrich nicht auslassen Sie vor sender oder der Interface Builder nicht in der Lage sein, Ihre Aktion zu verbinden, wie in hier:

@IBAction func someAction(sender:AnyObject) { 
    // this won't work and IB won't connect to this action 
    // because sender will be part of the symbol name 
} 
Verwandte Themen