我的应用程序有一个NSOutlineView
和一个NSTableView
,我对两者都有同样的问题。选中任一行后,按 Tab 键会将第一列置于编辑模式,而不是让下一个键查看第一响应者。要进入下一个关键视图,您需要在所有列之间切换。
此外,切换到任一视图会导致最后一列进入编辑模式,需要更多的切换选项卡才能进入其先前的关键视图。
万一这很重要,我使用的是自动计算的键视图循环,而不是我自己的,我NSWindow
设置为autorecalculatesKeyViewLoop = YES
. 一旦用户选择编辑列,我想在列之间切换,但我不认为 Tab 键触发编辑模式是标准行为。
更新
感谢以下有用的回复,我解决了。基本上,我-keyDown
在我的自定义表格视图类中进行了覆盖,该类处理表格视图中的制表符和移位制表符。然而,解决表格视图中的 shift-tabbing 问题更加困难。如果它接受来自另一个视图的控制,我YES
在自定义表视图中设置一个布尔属性。-acceptsFirstResponder
当当前事件是 shift-tab 事件时,委托会-tableView:shouldEditTableColumn:row
进行检查keyDown
。-tableView:shouldEditTableColumn:row
被调用并且它不是一个 shift-tab 事件,它将表视图的属性设置回,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;
}
. . .