4

テーブル ビュー ヘッダー (NSTableHeaderView) を右クリックすると、ユーザーが列の色を変更できるメニューが表示されます。問題は、彼らがどの列を「右クリック」したのかわからないことです。これを行う方法についてのアイデアはありますか?ありがとうございました。

4

2 に答える 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 のヘッダー ビューに割り当ててから、menudelegateアウトレットを接続します。

于 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 に答える