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