È necessario sottoclasse NSTableHeaderView
. Mentre è possibile visualizzare un menu senza sottoclassi, non è possibile scoprire quale colonna della tabella è stata cliccata senza sottoclassi (rendendo il menu di scelta rapida inutilizzabile).
Ho scritto il mio sublcass della vista dell'intestazione della tabella e aggiunto un delegato. Nel generatore di interfacce, individuare NSTableHeaderView
, assegnargli la sottoclasse personalizzata e collegarne la nuova presa delegate
. Inoltre, creare un menu e assegnarlo alla presa menu
.
Quindi implementare il metodo -validateMenu:forTableColumn:
nel delegato. Abilitare/disabilitare le voci di menu come appropriato (assicurarsi che il menu non si autovalidazione in IB). Memorizza la colonna cliccata da qualche parte in una variabile di istanza, in modo da sapere su quale colonna agire quando l'utente seleziona un'azione.
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
fonte
2014-06-27 07:57:07
funziona perfetto :) grazie – tubtub
Se si seleziona l'intestazione in Interface Builder, è anche possibile trascinare una connessione a un menu nel NIB/XIB. – Dov
come faresti a sapere su quale colonna è stato fatto clic con il pulsante destro del mouse? –