У моего приложения NSOutlineView
и NSTableView
, и у меня одна и та же проблема с обоими. Когда строка выбрана, нажатие клавиши табуляции переводит первый столбец в режим редактирования вместо того, чтобы следующий респондент просматривал следующий ключ. Чтобы перейти к следующему ключевому представлению, вам нужно просмотреть все столбцы.
Кроме того, вкладка Shift в любом из представлений приводит к переходу столбца last в режим редактирования, что требует большего количества клавиш Shift для перехода в его предыдущее представление ключа.
В случае, если это имеет значение, я использую цикл вычисления ключевых слов с автоматическим вычислением, а не свой собственный, с моим NSWindow
, установленным на autorecalculatesKeyViewLoop = YES
. Мне бы хотелось, чтобы вкладки между столбцами выбирались пользователем, когда он решает редактировать столбец, но я не думаю, что стандартное поведение для клавиши табуляции вызывает режим редактирования.
Обновление
Благодаря полезным ответам ниже, я решил это. По сути, я переопределяю -keyDown
в своем пользовательском классе табличного представления, который обрабатывает табулирование и сдвиг табуляции из табличного представления. Однако было сложнее решить табуляцию в представлении таблицы. Я установил логическое свойство YES
в пользовательском табличном представлении -acceptsFirstResponder
, если оно принимает управление из другого представления.
Делегат -tableView:shouldEditTableColumn:row
проверяет это, когда текущее событие является событием Shift-Tab 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;
}
. . .