在NSTableHeaderView中右键单击了哪一列

时间:2013-03-10 00:39:31

标签: objective-c cocoa nstableview nstableheaderview

当我右键单击我的表视图标题(NSTableHeaderView)时,我弹出一个菜单以允许用户更改列颜色。问题是我不知道他们只是“右键单击”了哪一列。关于如何做到这一点的任何想法?谢谢。

2 个答案:

答案 0 :(得分:1)

最简单的方法是在-menuForEvent:的子类中实现NSTableHeaderView

在我的应用中,我使用了更通用的解决方案。我在NSTableHeaderView中添加了一个委托。当请求菜单时,我的类要求代理验证菜单并将其传递给单击的表列。委托然后自定义菜单(启用菜单项,根据单击的列设置菜单项状态),并记住在实例变量中单击了哪个列。

<强> 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

<强> PGETableViewTableHeaderView.m

#import "PGETableViewTableHeaderView.h"

@implementation PGETableViewTableHeaderView
-(NSMenu *)menuForEvent:(NSEvent *)event {
    NSInteger clickedColumn = [self columnAtPoint:[self convertPoint:event.locationInWindow fromView:nil]];
    NSTableColumn *tableColumn = clickedColumn != -1 ? self.tableView.tableColumns[clickedColumn] : nil;
    NSMenu *menu = self.menu;
    [self.delegate validateMenu:menu forTableColumn:tableColumn];
    return menu;
}
@end

非常方便:将自定义子类分配给IB中的标题视图,然后连接menudelegate个出口。

答案 1 :(得分:0)

一种方法是在自定义的NSTableHeaderView类中覆盖rightMouseDown:

-(void)rightMouseDown:(NSEvent *)theEvent {
    NSPoint p = [self convertPoint:theEvent.locationInWindow fromView:nil];
    NSInteger selCol = [self columnAtPoint:p];
    NSLog(@"Clicked on header cell is in column: %ld",selCol);
}