objective-c - 在 NSTableHeaderView 中右键单击了哪一列

标签 objective-c cocoa nstableview nstableheaderview

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

最佳答案

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

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

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 中的标题 View ,然后连接 menudelegateoutlets。

关于objective-c - 在 NSTableHeaderView 中右键单击了哪一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317612/

相关文章:

objective-c - 代码中创建的 UIView 只在纵向模式下绘制

ios - 在验证方法后未调用 finishedWithAuth

objective-c - 使用 ARC 在 self.managedObjectContext 上调用 perfromBlock 时保留周期?

cocoa - UI刷新、NSOutlineView reloadData和递归方法

cocoa - NSTableColumn 仅自动调整第一列的大小

Objective-C游戏开发?

macos - 从 NSStatusItem 显示主窗口时出现问题

iphone - RESTful iPhone 客户端和模型层次结构

swift - 在核心数据中保存行号并按 desc 排序

macos - 如何在 NSTableView 底部添加工具栏?