4

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

4

2 回答 2

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插座。

于 2014-05-18T15:36:14.657 回答
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);
}
于 2013-03-10T06:10:55.817 回答