NSTextField ableiten / keyDown wird nicht aufgerufen?

  • NSTextField ableiten / keyDown wird nicht aufgerufen?

    Hallo,

    ich habe ein kleines Verständnisproblem, und zwar möchte ich NSTextField subclassen, um Tastaturevents abzufangen, weil ich in meinen Dialogboxen die Texteingabefelder mit den Cursor hoch/runter - Tasten "durchtabben" möchte. Außerdem möchte ich, daß die Delegate-Methode "textDidEndEditing:" auch aufgerufen wird, wenn nichts eingegeben wurde, das NSTextField also leer gelassen wurde.

    Meine Ableitung von NSTextField sieht so aus:

    Quellcode

    1. @interface ALTextField : NSTextField
    2. {
    3. }
    4. -(id) initWithFrame: (NSRect) rect;
    5. -(void) keyDown: (NSEvent *) event;
    6. -(BOOL) resignFirstResponder;
    7. @implementation ALTextField
    8. -(id) initWithFrame: (NSRect) rect
    9. {
    10. self = [super initWithFrame: rect];
    11. return self;
    12. }
    13. // keyDown wird nur aufgerufen, wenn resignFirstResponder NO zurückgibt?
    14. -(void) keyDown: (NSEvent *) event
    15. {
    16. NSLog(@"keyDown aufgerufen!");
    17. NSUInteger keyPressed = [event keyCode];
    18. NSLog(@"Keycode ist %d", keyPressed);
    19. if(keyPressed == 125)
    20. NSLog(@"Cursor down");
    21. [super keyDown: event];
    22. }
    23. -(BOOL) resignFirstResponder
    24. {
    25. NSLog(@"resignFirstResponder aufgerufen!");
    26. return NO;
    27. }
    28. @end
    Alles anzeigen


    Ich habe im Interface-Builder dann ein NSTextField in meine Dialogbox gezogen und im Inspector unter Identity Class in der Dropdown-Box ALTextField ausgewählt.

    Das Problem ist nur, daß die Methode keyDown in meiner Klasse nicht aufgerufen wird.

    Durch Zufall habe ich mal die Methode resignFirstResponder überschrieben und als Rückgabewert NO gesetzt. Jetzt wird keyDown aufgerufen. Gebe ich in resignFirstResponder YES zurück, wird keyDown nicht mehr aufgerufen. Warum nicht?

    In der überschriebenen Methode keyDown gebe ich den NSEvent "event" an die SuperKlasse, also NSTextField weiter, aber er wird anscheinend nicht verarbeitet. Irgendwie scheine ich wohl so ziemlich alles falsch zu machen.

    Kann mir jemand einen Tip geben?

    Liebe Grüße,

    Alf

    PS: Hier ist mal ein Beispielprojekt


    Test.zip
    Wenn alle Ideen patentiert und alle Programmierer verhaftet sind, wird die Welt feststellen, daß Rechtsanwälte nicht programmieren können.
  • RE: NSTextField ableiten / keyDown wird nicht aufgerufen?

    Vom schnellen Erstellen eines neuen fieldEditors würde ich abraten. Solange man keinen speziellen Zeichenbedarf hat, ist das eigentlich nicht erforderlich. Die meisten Tastaturereignisse kann man irgendwie auch mit den Notifications abfangen.
    I would be embarrassed if they did not spy on me.
  • Hallo,

    erstmal vielen Dank für eure Antworten.

    Ich werde mich wohl erst mal weiter mit dem fieldEditor beschäftigen. In meinem Programm existieren sehr viele Dialogboxen. Ich wollte halt die GUI-Elemente ableiten, um mir später unnötige Arbeit in jeder Dialogbox zu ersparen.

    Ich bin gerade dabei, mich in Cocoa einzuarbeiten, um irgendwann meine Auftragsbearbeitung auf Apple-Rechner laufen zu lassen. Momentan läuft die Auftragsbearbeitung und Produktionsplanung auf Linux-Rechnern.

    LG

    Alf
    Wenn alle Ideen patentiert und alle Programmierer verhaftet sind, wird die Welt feststellen, daß Rechtsanwälte nicht programmieren können.
  • Hallo,

    für alle, die es interessiert, hier meine Lösung:


    Quellcode

    1. @class ALFieldEditor;
    2. @interface ALTextField : NSTextField
    3. {
    4. }
    5. - (void) textDidEndEditing: (NSNotification *) notification;
    6. - (BOOL) textView: (NSTextView *)fieldEditor doCommandBySelector: (SEL) commandSelector;
    7. @end
    8. @implementation ALTextField
    9. - (void) textDidEndEditing: (NSNotification *) notification
    10. {
    11. NSDictionary *info = [notification userInfo];
    12. NSNumber *textMovement;
    13. textMovement = [info objectForKey: @"NSTextMovement"];
    14. int movementCode;
    15. movementCode = [textMovement intValue];
    16. if([self delegate] && [[self delegate] respondsToSelector:@selector(textShouldEndEditing:)])
    17. if(![[self delegate] textShouldEndEditing: (NSText*) self])
    18. {
    19. [[self window] makeFirstResponder: self];
    20. return;
    21. }
    22. if (movementCode == NSReturnTextMovement)
    23. {
    24. [[self window] makeFirstResponder: [self nextKeyView]];
    25. return;
    26. }
    27. [super textDidEndEditing: notification];
    28. }
    29. - (BOOL) textView: (NSTextView *)fieldEditor doCommandBySelector: (SEL) commandSelector
    30. {
    31. if (commandSelector == @selector(moveDown:))
    32. {
    33. if([self delegate] && [[self delegate] respondsToSelector:@selector(textShouldEndEditing:)])
    34. {
    35. if([[self delegate] textShouldEndEditing: (NSText*) self])
    36. [[self window] makeFirstResponder: [self nextKeyView]];
    37. }
    38. else
    39. [[self window] makeFirstResponder: [self nextKeyView]];
    40. return YES;
    41. }
    42. if(commandSelector == @selector (moveUp:))
    43. [[self window] makeFirstResponder: [self previousKeyView]];
    44. return NO;
    45. }
    46. @end
    Alles anzeigen


    Jetzt kann ich zwischen den einzelnen Textfeldern mit den Curser Hoch/Runter-Tasten vor und zurückschalten.

    Außerdem kann neben der Tab-Taste auch die Return-Taste zum Weiterschalten der Textfelder verwendet werden.

    Die Delegate-Methode textShouldEndEditing: wird jetzt auch aufgerufen, wenn nichts eingegeben wurde.

    LG,

    Alf
    Wenn alle Ideen patentiert und alle Programmierer verhaftet sind, wird die Welt feststellen, daß Rechtsanwälte nicht programmieren können.