1

我在基于单元格的 NSTableView 的列中有一个 NSTextFieldCell。这个单元格应该处理点击。当没有按下修饰键时,这可以正常工作。如果我按住 shift 或 command 键,表格视图会吞下 mouseDown 事件以尝试处理行选择。

有没有办法完全禁用 NSTableView 中的行选择?

有没有办法让 NSTableView 通过所有事件?

我的单元格子类派生自 TableViewLinks 示例代码中的 LinkTextFieldCell。它实现:

- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)flag

由于我不想要行选择,我的表视图委托实现:

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)rowIndex
{
    return NO;
}

- (BOOL)tableView:(NSTableView *)tableView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    return YES;
}

我的委托方法是从 -[NSTableView mouseDown:] 调用的。当没有按下修饰键时调用鼠标跟踪代码。

有没有比继承 NSTableView 来覆盖 -[NSTableView mouseDown:] 更好的方法来解决这个问题?

4

1 回答 1

0

我已经实现了一个解决方案,我覆盖了 mouseDown:。我真的不喜欢它。但它有效。仍然希望有更好的想法。

- (void)mouseDown:(NSEvent *)theEvent
{
    if (! [self handleMouseDown:theEvent]) {
        [super mouseDown:theEvent];
    }
}

- (BOOL)handleMouseDown:(NSEvent *)theEvent
{
    NSInteger                   clickCount                  = [theEvent clickCount];

    if (clickCount != 1) {
        return NO;
    }

    NSPoint                     locationInWindow            = [theEvent locationInWindow];
    NSPoint                     locationInView              = [self convertPoint:locationInWindow fromView:nil];
    NSInteger                   clickedRow                  = [self rowAtPoint:locationInView];
    NSInteger                   clickedColumn               = [self columnAtPoint:locationInView];

    if ((clickedRow < 0) || (clickedColumn < 0)) {
        return NO;
    }

    if ((clickedRow >= [self numberOfRows]) || (clickedColumn >= [self numberOfColumns])) {
        return NO;
    }

    NSArray                     *tableColumns               = [self tableColumns];

    NSTableColumn               *tableColumn                = [tableColumns objectAtIndex:clickedColumn];
    NSCell                      *cell                       = [tableColumn dataCellForRow:clickedRow];

    id <NSTableViewDelegate>    delegate                    = [self delegate];
    BOOL                        shouldTrackCell             = NO;

    if ([delegate respondsToSelector:@selector(tableView:shouldTrackCell:forTableColumn:row:)]) {
        shouldTrackCell = [delegate tableView:self shouldTrackCell:cell forTableColumn:tableColumn row:clickedRow];
    }

    if (! shouldTrackCell) {
        return NO;
    }

    BOOL                        prefersTrackingUntilMouseUp = [[cell class] prefersTrackingUntilMouseUp];
    NSRect                      cellFrame                   = [self frameOfCellAtColumn:clickedColumn row:clickedRow];

    return [cell trackMouse:theEvent inRect:cellFrame ofView:self untilMouseUp:prefersTrackingUntilMouseUp];
}
于 2014-05-02T19:38:40.263 回答