Я не уверен, что вы подразумеваете под редактированием в таблице без выделения, но в любом случае проблема переопределения hitTest: вместо validateProposedFirstResponder: forEvent: в том, что вы пропускаете всю информацию NSEvent: двойной щелчок или одиночный щелчок, mouseEvent или в противном случае и т. д.
я есть текстовые поля внутри собственного представления внутри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];
}