在按住Ctrl键单击/右键单击NSTableView的标题上显示上下文菜单

tub*_*tub 15 cocoa objective-c right-click nstableview

我正在寻找一种优雅的方法来检测NSTableView标题上的右键单击/按住Ctrl键单击.

当右键单击时,我想显示一个上下文菜单.

- (NSMenu *)menuForEvent:(NSEvent *)
Run Code Online (Sandbox Code Playgroud)

只检测表中的右键单击 - 而不是表格的标题.

谢谢你的帮助.

Joh*_*ger 39

有时一张照片解释了1000个单词.

  1. 您不需要子类化表视图.
  2. 在任何tableView上,您可以选择TableView并将菜单插座连接到菜单. 在此输入图像描述

  3. 现在,您可以将菜单选择器(右侧)连接到您的代码.

  4. 要确定单击表中的哪一行,请使用

[yourTableView clickedRow]

完成.像一个老板一样.

  • 当您单击标题时,@Julian `clickedColumn` 为 -1。你需要继承`NSTableHeaderView`。这个答案是错误的,你的评论是错误的。 (4认同)
  • 我不明白为什么会有这么多的赞成.问题清楚地询问表HEADER的上下文菜单.这只是展示如何在行上获取上下文菜单. (3认同)

Nat*_*ger 17

从NSTableView获取NSTableHeaderView并设置它的菜单.

[[myTableView headerView] setMenu:aMenu];
Run Code Online (Sandbox Code Playgroud)

  • 如果在Interface Builder中选择标题,还可以将连接拖动到NIB/XIB中的菜单. (2认同)

Jak*_*ger 5

您需要子类化NSTableHeaderView。尽管可以在没有子类的情况下显示菜单,但是如果没有子类,则无法找出单击了哪个表列(使上下文菜单无用)。

我编写了自己的表头视图的sublcass,并添加了一个委托。在界面生成器中,找到NSTableHeaderView,为其分配自定义子类,然后连接其新delegate插座。此外,创建菜单并将其分配给menu插座。

然后-validateMenu:forTableColumn:在委托中实现该方法。适当地启用/禁用菜单项(确保菜单未在IB中自动验证)。将单击的列存储在实例变量中的某个位置,这样您就知道用户选择操作时要对哪个列进行操作。

PGETableViewTableHeaderView.h

#import <Cocoa/Cocoa.h>
@protocol PGETableViewTableHeaderViewDelegate <NSObject>
-(void)validateMenu:(NSMenu*)menu forTableColumn:(NSTableColumn*)tableColumn;
@end
@interface PGETableViewTableHeaderView : NSTableHeaderView
@property(weak) IBOutlet id<PGETableViewTableHeaderViewDelegate> delegate;
@end
Run Code Online (Sandbox Code Playgroud)

PGETableViewTableHeaderView.m

#import "PGETableViewTableHeaderView.h"
@implementation PGETableViewTableHeaderView
-(NSMenu *)menuForEvent:(NSEvent *)event {
    NSInteger columnForMenu = [self columnAtPoint:[self convertPoint:event.locationInWindow fromView:nil]];
    NSTableColumn *tableColumn = nil;
    if (columnForMenu >= 0) tableColumn = self.tableView.tableColumns[columnForMenu];
    NSMenu *menu = self.menu;
    [self.delegate validateMenu:menu forTableColumn:tableColumn];
    return menu;
}
@end
Run Code Online (Sandbox Code Playgroud)