16

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

4

5 回答 5

23

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

您不需要NSTableView为此解决方案进行子类化。clickedRow也可在NSOutlineView.

于 2013-02-07T15:42:55.583 回答
11

虽然我还没有这样做,但我很确定你可以通过覆盖NSView's - (NSMenu*)menuForEvent:(NSEvent*)theEvent此链接中的示例进行点转换以确定索引。

-(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.
}
于 2012-09-19T12:37:26.940 回答
6

更新的答案

如果您想在打开菜单时获得点击的行索引,答案是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?)
于 2016-05-25T11:08:25.037 回答
3

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
于 2015-07-22T11:06:14.013 回答
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)
  }
于 2017-11-09T08:13:04.957 回答