Tiene que subclase NSTableHeaderView
. Si bien es posible hacer aparecer un menú sin crear subclases, no es posible descubrir en qué columna de la tabla se hizo clic sin subclases (haciendo inútil el menú contextual).
Escribí mi propia subcase de la vista de encabezado de tabla y agregué un delegado. En el generador de interfaces, busque NSTableHeaderView
, asígnele su subclase personalizada y conecte su nueva toma de corriente delegate
. Además, cree un menú y asígnelo a la salida menu
.
Luego, implemente el método -validateMenu:forTableColumn:
en el delegado. Habilite/deshabilite los elementos del menú según corresponda (asegúrese de que el menú no se autovalide en IB). Almacene la columna cliqueada en algún lugar de una variable de instancia, para que sepa en qué columna actuar cuando el usuario seleccione una acción.
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
funciona perfecto :) gracias – tubtub
Si selecciona el encabezado en el Interface Builder, también puede arrastrar una conexión a un menú en su NIB/XIB. – Dov
¿Cómo sabrías en qué columna se ha hecho clic con el botón derecho? –