当我右键单击我的表视图标题(NSTableHeaderView)时,我弹出一个菜单以允许用户更改列颜色。问题是我不知道他们只是“右键单击”了哪一列。关于如何做到这一点的任何想法?谢谢。
答案 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中的标题视图,然后连接menu
和delegate
个出口。
答案 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);
}