3

サブクラスでオーバーライド- (void)keyDown:(NSEvent *)eventしました。NSPanel

NSTextFieldただし、フォーカスがパネルの内側にない場合にのみ呼び出されます。ただし、フォーカスがテキストフィールドにあるかパネルにあるかに関係なく、「Enterボタンが押されました」というイベントをキャッチする必要があります。

常に呼び出されるようにするにはどうすればよいですか?

4

1 に答える 1

4

そのためのキーダウンイベントをキャッチする必要がありますか?

Appleは、コントロールをいじるkeyDown:のは一種の最後の手段であり、デリゲートを取り巻く通常のCocoaアーキテクチャがあなたが望むことを行わない場合にのみ使用されるとドキュメントで述べています。

エンターボタンが押されたことをキャッチすることが目的の場合は、テキストフィールドのこのイベントがtextDidEndEditingデリゲートメソッド(または、必要に応じて通知)をトリガーすることに注意してください。

したがってcontrolTextDidEndEditing:、デリゲートに実装NSTextFieldすると、イベントに対応できるはずです。この通知(および相対デリゲートメソッド)は、フィールドエディターが編集を終了したときに送信されます。

1ステップ前(フィールドエディターが編集を終了する前)にイベントをキャッチしたい場合は、control:textView:doCommandBySelector:特定のキーイベント(リターンキーなど)をインターセプトしてエディターの動作を変更できるデリゲートメソッドを実装できます。

例は次のとおりです。

- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{
    BOOL retval = NO;
    if (commandSelector == @selector(insertNewline:)) {
        retval = YES; // Handled

        // Do stuff that needs to be done when newLine is pressed
    }
    return retval;
}

Appleのサイトには、それに関する多くのドキュメントがあります。たとえば、ここで紹介します。

于 2012-06-12T10:34:18.110 に答える