テキストビューなどで押された特殊キーを横取りする

Cocoaに関するヌマタメモ
2008年11月29日 23:01

横取りしたい NSTextField / NSTextView の delegate を作成して、NSTextField には

- (BOOL)control:(NSControl *)control
       textView:(NSTextView *)textView
       doCommandBySelector:(SEL)command

を、NSTextView には

- (BOOL)textView:(NSTextView *)aTextView
    doCommandBySelector:(SEL)aSelector

を実装する。

渡されたセレクタが、以下のキーに対応している。

  • Tab: @selector(insertTab:)
  • ESC: @selector(cancel:)
  • Return: @selector(insertNewline:)
  • 上: @selector(moveUp:)
  • 下: @selector(moveDown:)
  • 左: @selector(moveLeft:)
  • 右: @selector(moveRight:)

  • Shift+Tab: @selector(insertBacktab:)

  • Cmd+左: @selector(moveToBeginningOfLine:)

  • Cmd+右: @selector(moveToEndOfLine:)

  • PageDown: @selector(scrollPageDown:)

  • PageUp: @selector(scrollPageUp:)
  • Home: @selector(scrollToBeginningOfDocument:)
  • End: @selector(scrollToEndOfDocument:)

ここで横取りしたキーをこのメソッドの中で処理した場合には YES を、そうでなければ NO をリターンする。

たとえば、ESCキーの無効化は次のようにして行う。

if (command == @selector(cancel:)) {
    return YES;
}

この他のキー(たとえば Option+Tab など)も、やはりそれに応じたセレクタを伴ってこの delegate メソッドが呼びされる。NSStringFromSelector(SEL aSelector) で確認できる。

初期の英辞郎ビューアではサブクラスを作って -[NSResponder keyDown:] を取っていたが、そんなことはしない方が良い。できるだけ標準の NSTextView を使っておく方が Interface Builder で扱いやすいという利点もある。

コメントを書く


トラックバックはありません。

トラックバックURL: http://numata.designed.jp/mt-tb.cgi/60