Responder chain durchsuchen

  • Responder chain durchsuchen

    Hi,

    wie kann ich die Objekte bzw. die Responder chain durchlaufen und einen selector prüfen.

    NSMenuItems validiere ich über die dafür vorgesehene Methode (-(BOOL)validateMenuItem:), ich würde das ganz aber auch gerne für Buttons in einer ähnlich Form umsetzen. Zu validateUserInterfaceItem sagt mir Doku folgendes: http://d.pr/i/OQJK+.
    Ich validiere meine Buttons aber in einer Subklasse von NSWindowController.

    Außerdem sind die besagten Buttons über einen ViewController gekapselt und haben durch die Bank dieselben Targets und Actions, wie die komplementären NSMenuItems. Die Validierung für die NSMenuItems funktioniert einwandfrei, meine Idee:

    (im ViewController, der die Buttons verwaltet)

    Quellcode

    1. - (void)validate {
    2. NSResponder *rep = [NSApplication sharedApplication];
    3. SEL editObjects = self.editButton.action;
    4. while (rep) {
    5. if ([rep respondsToSelector:@selector(validateMenuItem:)] &&
    6. [rep respondsToSelector:editObjects]) {
    7. NSMenuItem *tmpMenuItem = [NSMenuItem new];
    8. tmpMenuItem.action = editObjects;
    9. [self.editButton setEnabled:[rep validateMenuItem:tmpMenuItem]];
    10. break;
    11. } else {
    12. rep = rep.nextResponder;
    13. }
    14. }
    15. }
    Alles anzeigen

    (ich verwende in dem Projekt ARC deswegen kein release/retain)

    Das ist ein Ansatz aber ich habe folgende Probleme:

    Es ist nicht schön ein NSMenuItem zu erzeugen nur um es einmal durch die Validierung zu jagen, nur um einen BOOL am Ende zu erhalten
    Ich kann nicht sicher sein, dass sich die Button so wie die NSMenuItems verhalten, d.h. dass ich mit dieser Methode wirklich das richtige Objekt erwische, das auch "zur selben Zeit" von Cocoa dazu verwendet wird die NSMenuItems zu validieren

    Da die Buttons und NSMenuItems den gleichen Effekt haben, wenn sie vom User geklickt werden und die Validierung der NSMenuItems bereits steht würde ich ungerne diesen Code neu oder umschreiben müssen. Was meint ihr?
  • jopjip schrieb:

    Da die Buttons und NSMenuItems den gleichen Effekt haben, wenn sie vom User geklickt werden und die Validierung der NSMenuItems bereits steht würde ich ungerne diesen Code neu oder umschreiben müssen. Was meint ihr?

    Ich verstehe das Problem überhaupt nicht, das Du lösen willst.
    Die Responder-Chain durchläuft Cocoa automatisch um die eingebauten GUI-Elemente zu validieren. Unabhängig von irgendwelchen Controllern. D.h. Du mußt da gar nichts selber machen, außer ggf. eine validateMenuItem für Objekte zu schreiben, die das Target eines MenuItems sein können. Außer Du schreibst ein neues GUI-Element das sich automatisch validieren soll, so wie ein Menu-Item.

    EDIT: ich vermute jetzt zu wissen was Du machen willst: eine Subclass/Category von NSButton die automatisch validateMenuItem: aufruft und setEnabled macht.

    Das geht ganz anders (mal schnell hingeschrieben):

    Quellcode

    1. @implementation NSButton (Validation)
    2. -validate
    3. {
    4. id target=[NSApp targetForAction:[self action] to:[self target] from:self]; // Responder-Chain durchsuchen nach Objekt das auf die am Button hängende action reagiert
    5. if([target respondsToSelector:@selector(validateButtonItem:)] // bei dem die Action implementierenden Objekt anfragen ob der Button enabled/disabled sein soll
    6. [self setEnabled:[target validateButtonItem:self];
    7. }

    Jedes als target in Frage kommende Objekt muss dann -validateButtonItem: implementieren. Du kannst hier auch -validateUserInterfaceItem nehmen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von hns ()