У меня есть текстовые поля внутри пользовательского представления внутри NSOutlineView
. Для редактирования одной из этих ячеек требуется один клик, пауза и еще один клик. Первый единственный щелчок выбирает строку представления таблицы, а второй единственный щелчок рисует курсор в поле. Двойной щелчок по ячейке, позволяющий редактировать в табличном представлении на основе ячеек, выбирает только строку.
Поведение, которое я хочу: одним щелчком мыши изменить выбор и отредактировать.
Что мне нужно переопределить, чтобы получить это поведение?
Я прочитал несколько других сообщений:
- Шаблон
NSTextField
flyweight , по-видимому, не применим к табличным представлениям на основе представлений, где все представления ячеек создаются из перьев.
- Я попытался создать подкласс
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];
}