2011-05-06 7 views
6

nstextfieldのサブクラスを作成し、keydownイベントをオーバーライドしましたが、コードが機能しないため、keyupイベントをオーバーライドしてコードが完全に機能します。 私のKeyDownイベントコード(動作しない):NSTextfieldのkeydowneventをオーバーライド

-(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]; 
    } 

} 

私からkeyupコード(それが動作する):

-(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]; 
    } 

    } 

私のKeyDownイベントコードに問題がある場合、私は表示されません。任意の提案が受け入れられる

EDIT: NSTextFieldの代わりにNSTextViewをサブクラス化する必要があることを読んだ。

+0

「機能しない」と記載してください。 –

+1

これはNSLogを実行しますか?それはまったく呼ばれていますか?これらは、1つが動作し、1つは動作しない同じ正確なクラスの同じ正確なインスタンスですか? –

+0

nslogを実行しません –

答えて

7

したい場合のKeyDownイベントは、NSTextFieldでオーバーライドすることはできませんを見てみたいと思うでしょう、あなたがあなたのスーパービューのKeyDownイベントイベントを上書きしたりできNSTextViewを使用するか、単にNSTextFieldでkeyUpイベントをオーバーライドすることができ

8

あなたは使用してNSTextFieldDelegate法によりサブクラス化せずにそれを行うことができます。

@Darren Inksetterが言ったように、control:textView:doCommandBySelector:

まず、インターフェイスタグにNSTextFieldDelegateを宣言します。 次に、この方法を実装してください。

- (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

このプロトコル関数は、明らかにもう存在しません。 (macOS 10.13) – gerbil