Über den Firstresponder und programmierte Menus auf beliebe Methoden zugreifen

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

  • Über den Firstresponder und programmierte Menus auf beliebe Methoden zugreifen

    Hallo Leute,

    ich habe ein Menü in einem NSViewController für eine NSTableView programmiert. Auf die Methoden zuzugreifen vom erreiche ich mit einfach mit "[[NSMenuItem alloc] initWithTitle:title1 action:@selector(saveObject:) keyEquivalent:@""]"

    aber wie kann ich auf den FirstResponder per code zugreifen um eine konkrete Methode im Fristreponder aufzurufen?

    Im XIP ist es einfach :(

    Danke für eure Hilfe

    LG Chris
  • gigo1968 schrieb:

    aber wie kann ich auf den FirstResponder per code zugreifen um eine konkrete Methode im Fristreponder aufzurufen?

    Nun, den First Responder gibt es ja nicht. Der First Responder ist ja nur ein Platzhalter im xib und repräsentiert den Einstieg in die Responder Chain. Eine Nachricht an die Responder Chain schickst du über NSApplication:

    Quellcode

    1. [[NSApplication sharedApplication] sendAction:@selector(saveObject:) to:nil from:self];
  • gritsch schrieb:

    Michael schrieb:


    Quellcode

    1. [[NSApplication sharedApplication] sendAction:@selector(saveObject:) to:nil from:self];


    das drecksteil sendet die action aber auch an das mainwindow wenn ein anderes fenster den key hat und es nicht antwortet (und dessen delegate auch nicht). das finde ich irgendwie nicht korrekt - vielleicht gehts aber auch nur mir so ;)

    Das „Drecksteil“ verhält sich so, wie es dokumentiert ist:
    • ​An action is first associated with the key window.
    • If the key window is a panel and it can’t handle the action, the action is next associated with the main window.
  • Michael schrieb:

    gritsch schrieb:

    Michael schrieb:


    Quellcode

    1. [[NSApplication sharedApplication] sendAction:@selector(saveObject:) to:nil from:self];


    das drecksteil sendet die action aber auch an das mainwindow wenn ein anderes fenster den key hat und es nicht antwortet (und dessen delegate auch nicht). das finde ich irgendwie nicht korrekt - vielleicht gehts aber auch nur mir so ;)

    Das „Drecksteil“ verhält sich so, wie es dokumentiert ist:
    • ​An action is first associated with the key window.
    • If the key window is a panel and it can’t handle the action, the action is next associated with the main window.


    ja klar, habie nie was anderes behauptet.
    bei einem panel/sheet finde ichs ja noch ok, das macht es aber auch bei anderen fenstern (steht auch in der doku).
  • gritsch schrieb:

    bei einem panel/sheet finde ichs ja noch ok, das macht es aber auch bei anderen fenstern (steht auch in der doku).

    So ist die Responder Chain nun mal angelegt. Wenn man eine Nachricht die Responder Chain entlang schicken will, macht man das mit sendAction:to:from: mit nil als Target.
    Dein Vorschlag schickt die Nachricht ja nur an den First Responder. Wenn der die Methode nicht kennt, was man auch noch selbst abfragen muss, dann kommt die Nachricht nicht bei einem der möglichen nextResponder an, der die Nachricht dann verarbeiten könnte. Das ist eben nicht das Selbe, wie eine Connection zum First Responder im xib.
  • Michael schrieb:

    gritsch schrieb:

    bei einem panel/sheet finde ichs ja noch ok, das macht es aber auch bei anderen fenstern (steht auch in der doku).

    So ist die Responder Chain nun mal angelegt. Wenn man eine Nachricht die Responder Chain entlang schicken will, macht man das mit sendAction:to:from: mit nil als Target.
    Dein Vorschlag schickt die Nachricht ja nur an den First Responder. Wenn der die Methode nicht kennt, was man auch noch selbst abfragen muss, dann kommt die Nachricht nicht bei einem der möglichen nextResponder an, der die Nachricht dann verarbeiten könnte. Das ist eben nicht das Selbe, wie eine Connection zum First Responder im xib.


    er hat aber danach gefragt und nicht wie man an die responder-chain schickt.
    aber egal.
    wenn ich aber einen menüpunkt habe, möchte ich dass dieser nur ausgeführt wird wenn die aktion im aktuellen fenster ausgeführt werden kann und nicht im hauptfenster das wömiglich auf einem anderen screen, außerhalb des sichtbaren bereichs, verkleinert, geschlossen (ka, steht nicht in der doku) ist.
  • gritsch schrieb:

    er hat aber danach gefragt und nicht wie man an die responder-chain schickt.

    Er hat aber auch auf das Äquivalent im xib hingewiesen.

    gritsch schrieb:

    wenn ich aber einen menüpunkt habe, möchte ich dass dieser nur ausgeführt wird wenn die aktion im aktuellen fenster ausgeführt werden kann und nicht im hauptfenster das wömiglich auf einem anderen screen, außerhalb des sichtbaren bereichs, verkleinert, geschlossen (ka, steht nicht in der doku) ist.

    In dem Dokument, das ich oben verlinkt habe, stehen auch Beispiele, warum man auch im Hauptfenster Aktionen ausführen können will, obwohl man nicht Key-Window ist.
  • gritsch schrieb:

    Michael schrieb:

    gritsch schrieb:

    bei einem panel/sheet finde ichs ja noch ok, das macht es aber auch bei anderen fenstern (steht auch in der doku).

    So ist die Responder Chain nun mal angelegt. Wenn man eine Nachricht die Responder Chain entlang schicken will, macht man das mit sendAction:to:from: mit nil als Target.
    Dein Vorschlag schickt die Nachricht ja nur an den First Responder. Wenn der die Methode nicht kennt, was man auch noch selbst abfragen muss, dann kommt die Nachricht nicht bei einem der möglichen nextResponder an, der die Nachricht dann verarbeiten könnte. Das ist eben nicht das Selbe, wie eine Connection zum First Responder im xib.


    er hat aber danach gefragt und nicht wie man an die responder-chain schickt.
    aber egal.
    wenn ich aber einen menüpunkt habe, möchte ich dass dieser nur ausgeführt wird wenn die aktion im aktuellen fenster ausgeführt werden kann und nicht im hauptfenster das wömiglich auf einem anderen screen, außerhalb des sichtbaren bereichs, verkleinert, geschlossen (ka, steht nicht in der doku) ist.
    Doch genau das will man häufig, weil Cocoa so funktioniert. Und das hat einen Grund. (Genau genommen mutmaßlich 1273123876.)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?