我有一个带有自定义单元格的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没有。
答案 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()
}