NSTextView
で特殊キーの機能を変更したい時、普通に思い付くのは NSTextView
をサブクラス化する、という手だが、Cocoa の key binding 機能をうまく使うとサブクラス化しなくてもデリゲートで処理でき、しかもカスタマイズ機能までおまけでついてくる。
ポイントは NSTextView
のデリゲートメソッド -(BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector
。特殊キーを押すと、標準キーバインド(システム標準:/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict
、ユーザー標準:~/Library/KeyBindings/DefaultKeyBinding.dict
)が検索され、そこに登録されているキーに対しては対応するセレクタが NSTextView
の doCommandBySelector:(SEL)aSelector
に送られる。このメソッドは上述のデリゲート -(BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector
を呼び出し、戻り値が NO
なら自分の aSelector
メソッドを呼び出し、YES
なら何もしない。
例えば、標準キーバインドでは control-F
は moveForward:
にバインドされているため、上記の手順に従ってデリゲートに [delegate textView: aTextView doCommandBySelector: @selector(moveForward:)]
なるメソッド呼び出しが行われる。control-F
にある機能を割り当てたければ、デリゲートの上記メソッド中でその処理を行えばよい。しかも、ユーザーが control-F
の代わりに control-D
を moveForward:
に割り当てていれば、自動的に同じキーバインドが適用される。
疑問:アプリケーションごと、あるいは違う NSTextView
ごとに違うキーバインドを設定したいこともあると思うのだが、それはどうすれば実現できるんだろう?