Sie müssen die Unterklasse NSTableHeaderView
. Obwohl es möglich ist, ein Menü ohne Unterklassen zu erstellen, ist es nicht möglich herauszufinden, auf welche Tabellenspalte ohne Unterklasse geklickt wurde (wodurch das Kontextmenü unbrauchbar wird).
Ich habe meine eigene Untergruppe der Tabellenkopfansicht geschrieben und einen Delegaten hinzugefügt. Suchen Sie im Interface-Generator nach NSTableHeaderView
, weisen Sie ihm Ihre benutzerdefinierte Unterklasse zu und verbinden Sie seine neue delegate
Steckdose. Erstellen Sie außerdem ein Menü und weisen Sie es der menu
Steckdose zu. Geben Sie die -validateMenu:forTableColumn:
Methode in den Delegaten ein. Aktivieren/deaktivieren Sie die Menüoptionen entsprechend (stellen Sie sicher, dass das Menü in IB nicht automatisch validiert wird). Speichern Sie die angeklickte Spalte irgendwo in einer Instanzvariablen, damit Sie wissen, auf welche Spalte reagiert werden soll, wenn der Benutzer eine Aktion auswählt.
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
funktioniert perfekt MenuTableHeaderView :) danke – tubtub
Wenn Sie die Überschrift in Interface Builder auswählen, können Sie auch eine Verbindung zu einem Menü in Ihrem ziehen NIB/XIB. – Dov
Wie würden Sie herausfinden, auf welche Spalte geklickt wurde? –