横取りしたい 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 で扱いやすいという利点もある。
コメントを書く