Cocoa:右键单击NSTableView的单元格时如何设置上下文菜单

时间:2011-05-31 11:36:54

标签: cocoa contextmenu nstableview

我有一个带有自定义单元格的TableView。我希望当用户在其中一个单元格上单击鼠标右键(或任何其他Apple右键单击变体)时出现上下文菜单(并知道他们点击了哪个单元格)。

我尝试将NSTableView子类化并覆盖此方法:

- (NSMenu *)menuForEvent:(NSEvent *)theEvent;

但它永远不会被召唤。

另一方面,

- (void)rightMouseDown:(NSEvent *)theEvent;

获取调用。但我不确定这是我们想要的那个。

更多详情:

//
//  PTTableView.m
// 
//
//  Created by Nathan Hazout on 5/31/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "PTTableView.h"


@implementation PTTableView

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)rightMouseDown:(NSEvent *)theEvent { 
    NSLog(@"entered rightMouseDown");
}

- (NSMenu *)menuForEvent:(NSEvent *)theEvent {
    NSLog(@"entered menuForEvent");
    return [super menuForEvent:theEvent];
}

- (NSView *)hitTest:(NSPoint)aPoint{
    NSLog(@"entered hitTest");
    return [super hitTest:aPoint];
}

- (void)dealloc
{
    [super dealloc];
}

@end

调用rightMouseDown。 hiTest被多次调用。但是menuForEvent没有。

2 个答案:

答案 0 :(得分:58)

不需要处理事件处理,只需指定上下文菜单就可以将表视图的menu出口设置为指向要用于的NSMenu对象上下文菜单。

您可以在Interface Builder中执行此操作,方法是将NSMenu对象放入nib文件,然后从表格视图拖动到菜单以设置插座。

或者,您可以使用-setMenu: NSTableView方法(继承自NSResponder)以编程方式分配菜单。

答案 1 :(得分:3)

Rob答案的Swift 4版本:

添加菜单:

let menu = NSMenu()
menu.addItem(NSMenuItem(title: "Edit", action: #selector(tableViewEditItemClicked(_:)), keyEquivalent: ""))
menu.addItem(NSMenuItem(title: "Delete", action: #selector(tableViewDeleteItemClicked(_:)), keyEquivalent: ""))
tableView.menu = menu

功能:

@objc private func tableViewEditItemClicked(_ sender: AnyObject) {

    guard tableView.clickedRow >= 0 else { return }

    let item = items[tableView.clickedRow]

    showDetailsViewController(with: item)
}

@objc private func tableViewDeleteItemClicked(_ sender: AnyObject) {

    guard tableView.clickedRow >= 0 else { return }

    items.remove(at: tableView.clickedRow)

    tableView.reloadData()
}