NSMenuItems: FirstResponder und Funktionen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSMenuItems: FirstResponder und Funktionen

    Hey, ich habe in meinem Main.storyboard ein TextField, dessen Inhalt ich in die Zwischenablage kopieren möchte - über einen Eintrag in der Menüleiste, die der AppDelegate zugeordnet ist.

    Nur kennt die AppDelegate natürlich nicht das Outlet des TextFields im Main.storyboard. Allerdings bin ich der Meinung gelesen zu haben, dass unter Swift kein Import nötig ist, sofern die Files in gleichen Projekt sind. Stimmt aber nicht - der Compiler meckert mit mir. Wie kann ich daher die AppDelegate und das TextField miteinander "bekannt machen"?
  • Bin leider auch nach dem Lesen des Artikels in Bezug auf mein Problem noch nicht weitergekommen... ich möchte kein Event senden, sondern auf Daten in einem ViewController von außerhalb zugreifen.
  • mrtn.lxo schrieb:

    Bin leider auch nach dem Lesen des Artikels in Bezug auf mein Problem noch nicht weitergekommen... ich möchte kein Event senden, sondern auf Daten in einem ViewController von außerhalb zugreifen.

    Du möchtest vielleicht kein Event senden, aber der Menüpunkt, den Du angelegt hast, möchte dies. ;)

    Daher ist es natürlich wichtig zu verstehen, wie die "Responder Chain” funktioniert.

    Weiterhin solltest Du nicht auf Daten "in einem ViewController" zugreifen, sondern auf Daten "in dem Datenmodell" der App. D.h. Du legst die Daten aus dem UI des ViewControllers im DatenModell ab und kannst dann von anderer Stelle auf diese Daten im Datenmodell zugreifen.

    Ich weiss, es geht Dir um Swift, aber die Technik bleibt gleich und daher wirf mal einen Blick in "Concepts in Objective-C Programming". Evtl. gibt es auch schon eine Swift Version von dieser Doku.
  • Danke für eure Hinweise und den Input. Ich hatte während des Lesens den Eindruck, dass im Hinblick auf meine Anforderungen (Text aus TextField in die Zwischenablage zu kopieren) evtl. auch eine func im ViewController genügen würde, die entsprechendes macht. Die Funktion müsste jedoch durch ein sendEvent aus dem Menüpunkt heraus aufgerufen werden. Wäre das ein gangbarer Weg?
  • Auch einen Monat später bin ich an dieser Stelle leider immernoch nicht weiter gekommen.

    Ich habe eine Funktion in einer swift-Datei im Projekt, die ich über das App-Menü aufrufen möchte. Auch gelingt es mir nicht z.B. den Titel eines Menueintrages aus einer Funktion die nicht in der AppDelegate ist herauszufinden.

    Freue mich wirklich über jede Hilfe, bin der Verzweiflung nahe :(
  • Klasse, jetzt hat es geklappt! Ist denn die Vorgehensweise tatsächlich die pragmatischste, oder hätte ich es einfacher haben können? Ich habe jetzt...
    • Die IBAction manuell im ViewController angelegt
    • Das NSMenuItem habe ich mit dem FirstResponder der Application Scene verknüpft (bzw. mit der darin enthaltenen IBAction, die ich zuvor angelegt habe)
    Dies funktioniert jedoch nur mit Actions - wie kann ich ein passendes Outlet erzeugen?
  • macmoonshine schrieb:

    mrtn.lxo schrieb:

    Ich möchte den state des NSMenuItems nach Anklicken verändern.

    Für das Ändern des Status ist das Value-Binding besser geeignet. Für das Aktivieren und Deaktivieren solltest Du Dir auch mal NSMenuValidation ansehen.

    Habe die Referenz gelesen und gerade einige Zeit mit Recherche verbracht, aber leider keine geeigneten Beispiele bzw. nichts, dass ich adaptieren könnte, gefunden. Auch sehe ich keinen direkten Vorteil durch die Nutzung von Value-Binding, abgesehen davon, dass ich den state nicht "manuell" verändern muss?
  • Unabhängig vom Value-Binding habe ich aktuell noch Probleme mit der oben beschriebenen Vorgehensweise.

    Ich habe das NSMenuItem wie beschrieben mit dem FirstResponder verknüpft, die aufgerufene Funktion macht nicht viel, außer den sender.state zu ändern. Anfänglich hat das ohne Weiteres geklappt, mittlerweile ist jedoch das MenuItem disabled und ich kann es nicht mehr auswählen. Ich kann das Menu im InterfaceBuilder auch nicht auf "Enabled" setzen - der Wert ändert sich automatisch wieder, auch wenn ich "Auto Enables Items" deaktiviere. Meine Verwirrung ist perfekt.
  • mrtn.lxo schrieb:

    Auch sehe ich keinen direkten Vorteil durch die Nutzung von Value-Binding, abgesehen davon, dass ich den state nicht "manuell" verändern muss?

    Die Nachteile nicht Bindings und NSMenuValidation zu verwenden, beschreibst Du genau in deinem letzten Beitrag. Wenn deine App mehrere Dokumente gleichzeitig öffnen kann, muss sie das Menü für jedes geöffnete Dokument anpassen, wenn der Nutzer es aktiviert. Da hilft Dir der Sender einer Action-Methode überhaupt nicht weiter. Bindings stellst Du auch nicht zum First Responder sondern zu Controllern der App her. Für globale Einstellungen bietet sich beispielsweise der Shared User Defaults Controller an.
    „Meine Komplikation hatte eine Komplikation.“