2011-05-06 2 views
6

Ho creato una sottoclasse di nstextfield e ho eseguito l'override dell'evento keydown ma il mio codice non funziona, quindi sovrascrivo l'evento de keyup e il codice funziona perfettamente. Il mio codice keydown (non funziona):Override keydownevent in NSTextfield

-(void)keyDown:(NSEvent *)event { 
    NSLog(@"Key released: %hi", [event keyCode]); 

    if ([event keyCode]==125){ 

     [[self window] selectKeyViewFollowingView:self]; 
    } 
    if ([event keyCode]==126){ 

     [[self window] selectKeyViewPrecedingView:self]; 
    } 

} 

Il mio codice keyup (funziona):

-(void)keyUp:(NSEvent*)event 
{if ([event keyCode]==125){ 

     [[self window] selectKeyViewFollowingView:self]; 
    } 
    if ([event keyCode]==126){ 

     [[self window] selectKeyViewPrecedingView:self]; 
    } 

    if ([event keyCode]==36){ 

     [[self window] selectKeyViewFollowingView:self]; 
    } 

    } 

non vedo dove sia il problema con il mio codice keydown. Qualsiasi suggeriscono saranno accettati

EDIT: Ho letto che bisogna sottoclasse NSTextView invece di NSTextField.

+0

fornire ulteriori informazioni che descrive "non funziona". –

+1

esegue l'NSLog? viene chiamato? sono questi la stessa istanza esatta della stessa classe esatta in cui uno lavora e uno no? –

+0

Non esegue il nslog –

risposta

7

KeyDown non può essere sovrascritto in un NSTextField, se si vuole, è possibile ignorare l'evento KeyDown della vista super-o potrebbe utilizzare un NSTextView o semplicemente ignorare l'evento KeyUp nel NSTextField

8

è possibile farlo senza sottoclasse utilizzando metodi NSTextFieldDelegate:

Come ha detto @Darren Inksetter, è possibile utilizzare control:textView:doCommandBySelector:

Innanzitutto, dichiarare NSTextFieldDelegate nel tag dell'interfaccia. quindi implementare il metodo:

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector 
{ 
    if(commandSelector == @selector(moveUp:)){ 
     // Do yourthing here, like selectKeyViewFollowingView 
     return YES; // Return YES means don't pass it along responders chain. Return NO if you still want system's action on this key. 
    } 
    if(commandSelector == @selector(moveDown:)){ 
     // Do the same with the keys you want to track 
     return YES; 
    } 
    return NO; 
} 
+0

Apparentemente questa funzione di protocollo non esiste più. (macOS 10.13) – gerbil