gpt4 book ai didi

objective-c - 在 TableView 单元格中使用修饰键进行鼠标跟踪

转载 作者:行者123 更新时间:2023-12-03 17:21:50 24 4
gpt4 key购买 nike

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

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

有没有办法让 NSTableView 传递所有事件?

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

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

由于我不想进行行选择,因此我的 TableView 委托(delegate)实现了:

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

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

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

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

最佳答案

我已经实现了一个覆盖 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];
}

关于objective-c - 在 TableView 单元格中使用修饰键进行鼠标跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23433798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com