NSTableView右键单击行索引

时间:2012-09-19 12:13:53

标签: objective-c cocoa nstableview

我正在寻找一种从NSTableView获取右键单击行索引的方法,但我找不到任何委托方法或类属性。任何建议表示赞赏。

5 个答案:

答案 0 :(得分:20)

使用NSTableView方法- (NSInteger)clickedRow获取上次点击的行的索引。返回的NSInteger将是右键单击行的索引。

您不需要为此解决方案创建NSTableView子类。 clickedRow也可以使用NSOutlineView

答案 1 :(得分:11)

虽然我还没有做到这一点,但我相信你可以通过覆盖NSView - (NSMenu*)menuForEvent:(NSEvent*)theEventthis link中的示例执行点转换以确定索引。

-(NSMenu*)menuForEvent:(NSEvent*)theEvent
{
    NSPoint mousePoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];
   int row = [self rowAtPoint:mousePoint];
   // Produce the menu here or perform an action like selection of the row.
}

答案 2 :(得分:4)

更新答案

如果您想在菜单打开时点击行索引,答案为NSTableView.clickedRow。无论如何,这个属性仅在特定时刻可用,通常只有-1

此索引何时可用?这是NSMenuDelegate.menuWillOpen方法。因此,您要使代理符合并在类上实现该方法,并访问clickedRow属性。已经完成了。

final class FileNavigatorViewController: NSViewController, NSMenuDelegate {
    let ov = NSOutlineView() // Assumed you setup this properly.
    let ctxm = NSMenu()
    override func viewDidLoad() {
        super.viewDidLoad()
        ov.menu = ctxm
        ctxm.delegate = self
    }
    func menuWillOpen(_ menu: NSMenu) {
        print(outlineView.clickedRow)
    }
}

单击行索引可用,直到您单击菜单中的项目。所以这也有效。

final class FileNavigatorViewController: NSViewController {
    let ov = NSOutlineView() // Assumed you setup this properly.
    let ctxm = NSMenu()
    let item1 = NSMenuItem()
    override func viewDidLoad() {
        super.viewDidLoad()
        ov.menu = ctxm
        ov.addItem(item1)
        ov.target = self
        ov.action = #selector(onClickItem1(_:))
    }
    @objc
    func onClickItem1(_: NSObject?) {
        print(outlineView.clickedRow)
    }
}

我在macOS Sierra上测试了这个(10.12.5)。

旧答案

从OS X 10.11开始,Apple最终添加了一种方法来轻松访问clickedRow。只需将NSTableView作为子类并覆盖此方法,就我所经历的情况而言,您将获得clickedRow

func willOpenMenu(menu: NSMenu, withEvent event: NSEvent)

这需要子类化,但无论如何,这是访问clickedRow的最简洁和最简单的方法。

此外,还有配对方法。

func didCloseMenu(menu: NSMenu, withEvent event: NSEvent?)

答案 3 :(得分:2)

通过在menuForEvent:子类中实现NSTableView,只需右键单击选择行:

@implementation MyTableView

- (NSMenu *)menuForEvent:(NSEvent *)theEvent
{
    int row = [self rowAtPoint:[self convertPoint:theEvent.locationInWindow fromView:nil]];
    if (row == -1) 
        return nil;
    if (row != self.selectedRow)
        [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
    return self.menu;
}

@end

答案 4 :(得分:0)

如果您不需要打开NSMenu但需要知道“带行号的右键动作”,我认为最简单的方法如下。 (Swift4代码)不需要任何其他连接的外部NSMenu类。

class SomeViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
  @IBOutlet weak var tableView: NSTableView!
  ...

  override func viewDidLoad() {
    ...
    tableView.action = #selector(some method()) // left single click action
    tableView.doubleAction = #selector(someMethod()) // left double click action
  }

  // right click action
  override func rightMouseDown(with theEvent: NSEvent) {
    let point = tableView.convert(theEvent.locationInWindow, from: nil)
    let row = tableView.row(at: point)
    print("right click")
    print(row)
  }