У меня есть текстовые поля внутри пользовательского представления внутри NSOutlineView
. Для редактирования одной из этих ячеек требуется один клик, пауза и еще один клик. Первый одиночный клик выбирает строку вида таблицы, а второй одиночный клик рисует курсор в поле. Двойной щелчок по ячейке, который позволяет редактировать в виде таблицы на основе таблицы, выбирает только строку.
Поведение, которое я хочу: один клик, чтобы изменить выбор и изменить.
Что мне нужно переопределить, чтобы получить это поведение?
Я прочитал несколько других сообщений:
-
NSTextField
flyweight pattern, похоже, не будет применяться к представлениям таблиц на основе представления, где все представления ячеек создаются из nibs. - Я попробовал подклассификацию
NSTextField
как это решение описывает, но мой переопределенный методmouseDown
не вызывается. Вызывается переопределенныеawakeFromNib
иviewWillDraw
(упомянутые в этом сообщении). Конечно,mouseDown
вызывается, если я помещаю текстовое поле где-то вне табличного представления.
Для сравнения, a NSSegmentedControl
в моем представлении ячейки меняет свое значение без предварительного выбора строки.
Здесь рабочее решение адаптировано из принятого ответа:
В подклассе вида:
-(void)mouseDown:(NSEvent *)theEvent {
[super mouseDown:theEvent];
// Forward the click to the row cell view
NSPoint selfPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
NSInteger row = [self rowAtPoint:selfPoint];
if (row>=0) [(CellViewSubclass *)[self viewAtColumn:0 row:row makeIfNecessary:NO]
mouseDownForTextFields:theEvent];
}
В подклассе ячеек таблицы:
// Respond to clicks within text fields only, because other clicks will be duplicates of events passed to mouseDown
- (void)mouseDownForTextFields:(NSEvent *)theEvent {
// If shift or command are being held, we're selecting rows, so ignore
if ((NSCommandKeyMask | NSShiftKeyMask) & [theEvent modifierFlags]) return;
NSPoint selfPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
for (NSView *subview in [self subviews])
if ([subview isKindOfClass:[NSTextField class]])
if (NSPointInRect(selfPoint, [subview frame]))
[[self window] makeFirstResponder:subview];
}