У меня есть текстовые поля внутри пользовательского представления внутри файла NSOutlineView
. Для редактирования одной из этих ячеек требуется один щелчок, пауза и еще один щелчок. Первый одиночный щелчок выбирает строку табличного представления, а второй одиночный щелчок рисует курсор в поле. Двойной щелчок по ячейке, который позволяет редактировать в представлении таблицы на основе ячеек, выбирает только строку.
Поведение, которое я хочу: один щелчок, чтобы изменить выбор и отредактировать.
Что мне нужно переопределить, чтобы получить такое поведение?
Я читал некоторые другие сообщения:
- Шаблон
NSTextField
приспособленца, по-видимому, не применим к основанным на представлениях табличные представления, где все представления ячеек создаются из перьев. - Я попытался создать подкласс
NSTextField
, например этот решение описывает, но мой переопределенный методmouseDown
не вызывается. Вызываются переопределенныеawakeFromNib
иviewWillDraw
(упомянутые в этом сообщении) . Конечно,mouseDown
вызывается, если я помещаю текстовое поле где-то за пределами табличного представления.
Для сравнения, NSSegmentedControl
в представлении моей ячейки изменяет свое значение без предварительного выбора строки.
Вот рабочее решение, адаптированное из принятого ответа:
В подклассе представления схемы:
-(void)mouseDown:(NSEvent *)theEvent {
[super mouseDown:theEvent];
// Forward the click to the row's 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];
}