Menüitem ruft Methode auf

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

  • Menüitem ruft Methode auf

    Hi,

    Ich habe folgendes Problem:
    In einer Cocoa App habe ich das automatisch erzeugte Menü durch ein neues Menü ( Typ NSMenu ) erweitert. Darunter gibt es dann Untermenüs und Menüpunkte (Typ NSMenuItem ), die verschiedene Sachen machen sollen. Das ganze dient nur zum Verständnis, wie man mit Menüs arbeitet.
    Das automatisch erzeugte Window hat einen ViewController mit entsprechenden Dateien ViewController.m und ViewController.h und zugehöriger View.

    Wenn ich einen Menüpunkt auf eine View mit CTRL verlinke und den Menüpunkt aufrufe, wird die View angezeigt .. so weit so gut.
    Wenn ich aber will, dass bei Auswahl des Menüpunkts eine Methode aufgerufen wird, muss ich die Methode in AppDelegate.m und .h reinbauen. Dann kann ich sie verlinken und alles ist ebenfalls gut.

    Ich will aber, dass die Methode aufgerufen wird und ein Label in der Standardview geändert wird. Das soll z.B. als letzter Befehl in der Methode passieren, damit man sieht, dass die Methode durch ist.
    Die Methode kommt in AppDelegate.h und ich kann sie aus dem Menü verlinken. Packe ich sie in ViewController.h geht keine Verlinkung aus dem Menü (oder ich mache was grundlegendes falsch)
    Aus der AppDelegate.m habe ich aber keinen Zugriff auf das Label und aus der ViewController.m kann ich die Methode nicht verlinken.

    Also wie mache ich das ?
    Muss ich mir da eine Methode in ViewController.h bzw .m schreiben, die das Label verändert und in der AppDelegate.m mir eine Instanz des ViewControllers holen und dann da die Methode aufrufen ?
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein
  • Hmm irgendwie fehlt mir da noch ein Schritt.

    Die Methode doSomething: ist in ViewController.h definiert und in ViewController.m implementiert.
    Das Menü hat einen Eintrag "Rufe doSomething auf".
    Im Document Outline sind 3 Einträge für First Responder. Wozu der First Responder da ist, habe ich auch verstanden.
    Aber ich kann den Menü Eintrag nur auf den First Responder in der Application Scene ziehen. Im aufgehenden Menü ist auch meine doSomething: Methode drin und ich kann die auswählen.
    Wenn ich die App dann starte, kommt in der Console : "Could not connect the action doSomething: to target of class AppDelegate."
    In ViewController.m ist vor der Methode doSomething: auch ein Kreis, aber ein leerer und nicht wie sonst, wenn was verknüpft ist, ein voller.
    Klicke ich den First Responder in der View Controller Scene an, dann steht die doSomething: in der Liste der Received Actions, aber ohne Verknüpfung.
    Vom Gefühl her würde ich sagen : Das Menü sagt dem First Responder, er soll bitte doSomething: aufrufen, aber der First Responder weiß noch nirgendwo, das die in der ViewController.h definiert ist.
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein
  • FWerewolf schrieb:

    Wenn ich die App dann starte, kommt in der Console : "Could not connect the action doSomething: to target of class AppDelegate."

    Hast du mal geprüft, ob im Interface-Builder noch die alte Verbindung besteht?

    FWerewolf schrieb:

    Vom Gefühl her würde ich sagen : Das Menü sagt dem First Responder, er soll bitte doSomething: aufrufen, aber der First Responder weiß noch nirgendwo, das die in der ViewController.h definiert ist.

    Das ist ein Wunder des Interface-Builders. ;)

    Der First-Responder ist im Gegensatz zu der anderen Objekten im Storyboard oder NIB kein festgelegtes Objekt, sondern immer das erste Objekt aus der Responder-Chain. Die Nachricht, die das Menü-Item sendet, wandert solange durch diese Kette, bis es ein Objekt findet, dass es verarbeitet. Aus diesem Grund besitzt der First-Responder im Interface-Builder immer alle möglichen Action-Methoden.
    „Meine Komplikation hatte eine Komplikation.“
  • Der Fehler ist weg. Ich hab das Projekt neu erstellt. War ja nur ein Testprojekt mit wenig drin.
    Allerdings ist der Menüeintrag nach dem Start noch grau.
    Das passiert doch, wenn kein Objekt gefunden wurde, das auf die Nachricht doSomething: reagiert, oder ?
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein