Я не уверен, что вы подразумеваете под редактированием в таблице без выделения, но в любом случае проблема переопределения 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];
}

Ответы на вопрос(5)

Ваш ответ на вопрос