【发布时间】:2011-08-01 19:54:12
【问题描述】:
我的应用程序有一个NSOutlineView 和一个NSTableView,我在这两个方面都遇到了同样的问题。选中任一行后,按 Tab 键可使第一列进入编辑模式,而不是让下一个键查看第一响应者。要进入下一个关键视图,您需要在所有列之间切换。
此外,切换到任一视图会导致 last 列进入编辑模式,需要更多的切换选项卡才能进入其先前的关键视图。
以防万一,我使用的是自动计算的键视图循环,而不是我自己的,我的 NSWindow 设置为 autorecalculatesKeyViewLoop = YES。一旦用户选择编辑列,我希望在列之间切换,但我不认为这是 trigger 编辑模式的 tab 键的标准行为。
更新
感谢以下有用的回复,我解决了。基本上,我在我的自定义表格视图类中覆盖-keyDown,它处理表格视图中的制表符和移位制表符。然而,解决表格视图中的 shift-tabbing 问题更加困难。如果它接受来自另一个视图的控制,我在自定义表视图的 -acceptsFirstResponder 中将布尔属性设置为 YES。
当当前事件是 shift-tab keyDown 事件时,代理的 -tableView:shouldEditTableColumn:row 会检查这一点。 -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;
}
. . .
【问题讨论】:
标签: cocoa macos keyboard nstableview nsoutlineview