NSTableView:如何突出显示右键单击的项目?

时间:2011-10-03 15:42:16

标签: objective-c nstableview

我有一个NSTableView,在没有用户干预的情况下添加了项目。当用户返回包含NSTableView的对话框并单击某个项目时,该项目将突出显示。但是,如果右键单击某个项目,则该项目不会突出显示。有没有办法突出显示右键单击的项目?

我目前有以下内容:

void Dialog::menuAction(ui::Menu::Item* item)
{ 
  // Highlight the item clicked
  [tableView row:item select:YES]
  ...
}

但这似乎不起作用。

4 个答案:

答案 0 :(得分:1)

这可能不是您想要的,但它可能有所帮助。获得右键单击的行以获取上下文菜单时出现问题。我正在使用大纲视图,而不是表格视图,它位于主窗口中,而不是对话框。

我有一个出口到我的观点。在处理菜单的对象中,我有以下方法:

-(void)setSelectionFromClick{

NSInteger theClickedRow = [myOutlineView   clickedRow];

NSIndexSet *thisIndexSet = [NSIndexSet indexSetWithIndex:theClickedRow];
[myOutlineView selectRowIndexes:thisIndexSet byExtendingSelection:NO];
}

我在每个菜单操作开始时调用此方法。

无论按下哪个按钮,都会设置单击的行。但选择仅在单击左键时自动更改。顺便说一下,这也适用于按住Control键盘。

答案 1 :(得分:1)

我的解决方案到目前为止似乎是最干净的,它是将NSTableView子类化,并实现其menuForEvent消息。只需将表视图作为此视图的子类,即可自动获得正确的行为:

@interface CustomTableView : NSTableView
@end

@implementation CustomTableView

- (NSMenu*) menuForEvent:(NSEvent*)event // override
{
    // Get to row at point
    NSInteger row = [self rowAtPoint:[self convertPoint:event.locationInWindow fromView:nil]];
    if (row >= 0) {
        // and check whether it is selected
        if (NOT [self isRowSelected:row]) {
            // No -> select that row
            [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
        }
    }
    return [super menuForEvent:event];
}

@end

应该与NSOutlineView类似地工作。

请注意代码如何决定何时突出显示该行。这会紧密模仿您在Finder中可以看到的行为,例如:

  • 如果您右键单击现有选择,尤其是其中有多个项目,则它们将保持选中状态。
  • 如果在当前选择项之外单击鼠标右键,则新单击的行将成为新选择项。

但是,这并不完美:仅当用户实际使用上下文菜单中的一项时,Finder才会更改选择。如果用户取消弹出菜单,则选择不会更改。但是,我的代码更改了之前用户从弹出菜单中进行选择的选择。随时对此进行改进,并在此处分享。

答案 2 :(得分:1)

只是@Thomas Tempelmann 解决方案的快速版本。

public class TableViewWithRightClickSelect: NSTableView
{
    override open func menu(for event: NSEvent) -> NSMenu?
    {
        let row = self.row(at: self.convert(event.locationInWindow, from: nil))
        if row >= 0
        {
            self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false)
        }
        
        return super.menu(for: event)
    }
}

答案 3 :(得分:0)

我认为您应该继承NSTableView并覆盖OnMouseUp和OnMouseDown,以便在右键单击事件时返回左键单击事件。