矢印キーを使用してテーブルビューをナビゲートするにはどうすればよいですか。setAction:
またはとよく似setDoubleAction
ていますが、クリックに反応する代わりに、テーブル内を上下に移動する矢印キーに反応します。
4 に答える
テーブルビューデリゲートで、を実装しtableView:shouldSelectRow:
ます。やりたいことを何でもしてから、を返しYES
ます。テーブルビューでアイテムを選択するとトリガーされます。
テーブルで何かを選択すると、矢印キーを使用してテーブル内を上下に移動できるため、意味がわかりません。しかし、動作をさらにカスタマイズしたい場合は、解決策があります。私のアプリの1つで、リターンキーまたはエンターキーが押されたことを検出し、それに応じて何らかのアクションを実行したいと思いました。新しいクラスを作成し、それをNSWindowのサブクラスにしました。Interface Builderで、メインウィンドウをこのクラスに設定しました。次に、そのサブクラスのNSWindowのkeyDown:メソッドをオーバーライドします。したがって、メインウィンドウが最前面(ファーストレスポンダー)にあるときはいつでも、キーの押下が検出され、メソッドによってフィルタリングされます。アロープレスでも同様のことができると思います。キーの押下をどのようにキャッチするかに応じて、クラスをNSWindowではなくNSTableViewのサブクラスにすることができます。
- (void)keyDown:(NSEvent *)theEvent {
if ([theEvent type] == NSKeyDown) {
NSString* characters = [theEvent characters];
if (([characters length] > 0) && (([characters characterAtIndex:0] == NSCarriageReturnCharacter) || ([characters characterAtIndex:0] == NSEnterCharacter))) {
// do something here when return or enter is pressed
}
}
}
あはは!これを行うことで誤ってNSTableViewを壊しましたか?
@implementation NSTableView ( DeleteKeyCategory )
-( void ) keyDown: ( NSEvent * ) event
{
// ... do something ...
[super keyDown:event];
}
@end
私にとって、これにはNSTableViewのkeyDown:ルーチンを置き換えるという悪意のある副作用があり、カーソルキーが壊れていました。(スウィズリングのようなもの)
私が学んだ教訓:-keyDown:ルーチンを完全に避けてください。-Apple NSControlsをサブクラス化すると、長期的には作業を節約できます。
これは、NSTableViewの使用を非常に苛立たせるタイプの間違いです。たぶん、Appleは静的アナライザーでこの種のものを検出できるでしょうか?
矢印は、アクションの実行ではなく、選択に使用されます。選択したアイテムに適用されるアクションは、通常、TableViewの「action」または「doubleAction」プロパティによって設定されます。
テーブル行をクリックすると、2つの異なることが行われます。
テーブル行を選択しようとします(テーブル行の選択を拒否できる場合があります。そのため、「shouldSelect」デリゲートメソッドがあります)。
新しい選択が行われた場合、アクションが実行されます(送信者としてtableViewを使用)。そこで、現在の選択についてテーブルに質問し、必要なことを何でも行うことができます。
いくつかの選択された行、選択された列、または他の多くの複雑な状況がある場合の状況を考慮してください。
あなたの場合---私がお勧めするのは、
selectionDidChange:(NSNotigivation)通知;
NSTableViewデリゲート呼び出し。これは、選択が変更された後と呼ばれ、それまでに新しい現在の選択を知っており、選択したアイテムに対して好きなことを行います。