私のアプリにはNSOutlineView
とがありNSTableView
、両方で同じ問題が発生しています。いずれかの行が選択されている状態で Tab キーを押すと、次のキー ビューをファーストレスポンダーにする代わりに、最初の列が編集モードになります。次の重要なビューに移動するには、すべての列をタブで移動する必要があります。
また、いずれかのビューに Shift キーを押しながらタブ移動すると、最後の列が編集モードになり、前のキー ビューに移動するためにさらにシフト タブが必要になります。
重要な場合は、自分のではなく、自動計算されたキー ビュー ループを にNSWindow
設定して使用していautorecalculatesKeyViewLoop = YES
ます。ユーザーが列を編集することを選択したら、列間をタブで移動したいと思いますが、タブキーが編集モードをトリガーするのは標準的な動作ではないと思います。
アップデート
以下の役立つ回答のおかげで、解決しました。基本的に-keyDown
、カスタム テーブル ビュー クラスをオーバーライドします。これは、テーブル ビューからのタブ移動とシフト タブ移動を処理します。ただし、テーブル ビューへのシフト タブ移動を解決するのはより困難でした。別のビューからコントロールを受け入れる場合YES
、カスタム テーブル ビューにブール値のプロパティを設定します。-acceptsFirstResponder
デリゲート-tableView:shouldEditTableColumn:row
は、現在のイベントがシフト タブkeyDown
イベントである場合にそれをチェックします。-tableView:shouldEditTableColumn:row
が呼び出され、それはシフト タブ イベントではありません。テーブル ビューのプロパティを に戻してNO
、通常どおり編集できるようにします。
以下に完全なソリューションを貼り付けました。
/* CustomTableView.h */
@interface CustomTableView : NSTableView {}
@property (assign) BOOL justFocused;
@end
/* CustomTableView.m */
@implementation CustomTableView
@synthesize justFocused;
- (BOOL)acceptsFirstResponder {
if ([[self window] firstResponder] != self) {
justFocused = YES;
}
return YES;
}
- (void)keyDown:(NSEvent *)theEvent
{
// Handle the Tab key
if ([[theEvent characters] characterAtIndex:0] == NSTabCharacter) {
if (([theEvent modifierFlags] & NSShiftKeyMask) != NSShiftKeyMask) {
[[self window] selectKeyViewFollowingView:self];
} else {
[[self window] selectKeyViewPrecedingView:self];
}
}
else {
[super keyDown:theEvent];
}
}
@end
/* TableViewDelegate.m */
. . .
- (BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row
{
NSEvent *event = [NSApp currentEvent];
BOOL shiftTabbedIn = ([event type] == NSKeyDown
&& [[event characters] characterAtIndex:0] == NSBackTabCharacter);
if (shiftTabbedIn && ((CustomTableView *)tableView).justFocused == YES) {
return NO;
} else {
((CustomTableView *)tableView).justFocused = NO;
}
return YES;
}
. . .