テーブル ビュー ヘッダー (NSTableHeaderView) を右クリックすると、ユーザーが列の色を変更できるメニューが表示されます。問題は、彼らがどの列を「右クリック」したのかわからないことです。これを行う方法についてのアイデアはありますか?ありがとうございました。
2 に答える
1
-menuForEvent:
これを行う最も簡単な方法は、 のサブクラスに実装することですNSTableHeaderView
。
私のアプリでは、より一般的なソリューションを使用しています。NSTableHeaderView にデリゲートを追加しました。メニューが要求されると、私のクラスはデリゲートにメニューを検証するように要求し、クリックされたテーブル列に渡します。その後、デリゲートはメニューをカスタマイズし (メニュー項目を有効にし、クリックされた列に応じてメニュー項目の状態を設定します)、どの列がクリックされたかをインスタンス変数に記憶します。
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 のヘッダー ビューに割り当ててから、menu
とdelegate
アウトレットを接続します。
于 2014-05-18T15:36:14.657 に答える
0
これを行う 1 つの方法は、カスタム NSTableHeaderView クラスで rightMouseDown をオーバーライドすることです。
-(void)rightMouseDown:(NSEvent *)theEvent {
NSPoint p = [self convertPoint:theEvent.locationInWindow fromView:nil];
NSInteger selCol = [self columnAtPoint:p];
NSLog(@"Clicked on header cell is in column: %ld",selCol);
}
于 2013-03-10T06:10:55.817 に答える