我在基于单元格的NSTableView的列中有一个NSTextFieldCell。此单元格应处理点击。没有按下修改键时,这可以正常工作。如果我按住shift或命令键,表视图会吞下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:]?
答案 0 :(得分: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];
}