Вам нужно создать подкласс NSTableHeaderView
. Хотя меню можно отобразить без подклассов, невозможно определить, по какому столбцу таблицы щелкнули без подклассов (что делает контекстное меню бесполезным).
Я написал свой собственный подкласс представления заголовка таблицы и добавил делегата. В конструкторе интерфейсов найдите 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
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