按住 Ctrl 键单击/右键单击 NSTableView 标题时显示上下文菜单
我正在寻找一种优雅的方法来检测 NSTableView 标题上的右键单击/Ctrl 单击。
当右键单击发生时,我想显示一个上下文菜单。
- (NSMenu *)menuForEvent:(NSEvent *)
仅检测表格中的右键单击 - 而不是表格标题中的右键单击。
感谢您的帮助。
I'm searching for an elegant way to detect a right-click/ctrl-click on the header of an NSTableView.
When the right click occurs, I want to display an contextual menu.
- (NSMenu *)menuForEvent:(NSEvent *)
detects only right clicks in the table - not in the header of the table.
thanks for your help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
有时一张图片可以解释1000个单词。
在任何 tableView 上,您都可以选择 TableView 并将菜单出口连接到菜单。
现在您可以将菜单选择器(右侧)连接到您的代码。< /p>
完成。像一个老板一样。
Sometimes a picture explains a 1000 words.
On any tableView you can select the TableView and connect the menu outlet to a menu.
Now you can wire the selector of the menu (on the right) to your code .
Done. Like a boss.
从 NSTableView 获取 NSTableHeaderView 并设置它的菜单。
Get the NSTableHeaderView from the NSTableView and set it's menu.
您需要子类化
NSTableHeaderView
。虽然可以在没有子类化的情况下显示菜单,但在没有子类化的情况下不可能找出单击了哪个表列(使得上下文菜单无用)。我编写了自己的表头视图子类,并添加了一个委托。在界面构建器中,找到
NSTableHeaderView
,为其分配您的自定义子类,然后连接其新的delegate
出口。此外,创建一个菜单并将其分配给menu
出口。然后在委托中实现
-validateMenu:forTableColumn:
方法。适当地启用/禁用菜单项(确保菜单不会在 IB 中自动验证)。将单击的列存储在实例变量中的某个位置,以便您知道当用户选择操作时要对哪一列进行操作。PGETableViewTableHeaderView.h
PGETableViewTableHeaderView.m
You need to subclass
NSTableHeaderView
. While it is possible to make a menu show up without subclassing, it is not possible to find out which table column was clicked without subclassing (making the context menu useless).I wrote my own sublcass of the table header view, and added a delegate. In interface builder, find the
NSTableHeaderView
, assign it your custom subclass, and connect its newdelegate
outlet. Additionally, create a menu and assign it to themenu
outlet.Then implement the
-validateMenu:forTableColumn:
method in the delegate. Enable/disable menu items as apropriate (make sure that the menu doesn't autovalidate in IB). Store the clicked column somewhere in an instance variable, so you know which column to act on when the user selects an action.PGETableViewTableHeaderView.h
PGETableViewTableHeaderView.m
感谢雅各布·艾格的准确回答。
我想出了这种方法的 Swift 版本。我稍微更改了委托方法签名,以便在 ViewController 中存在多个 TableView 的情况下提供更大的灵活性。
要使用此自定义类,请在界面生成器中找到 NSTableHeaderView 并将该类更改为 MenuTableHeaderView
您必须输入的窗口自定义类名
在 ViewController 中使用此方法的示例
Thanks Jakob Egger for his precise answer.
I come up with Swift version of this approach. I changed the delegate method signature a little bit, to give more flexibility in case of more then one TableView in ViewController.
To use this custom class, find NSTableHeaderView in the interface builder and change the class to MenuTableHeaderView
Window where you have to enter custom class name
Example of this approach usage in a ViewController