行をクリックしているユーザーをキャッチするには (ユーザーが行をクリックしたときのみであり、プログラムで選択されたときではありません):
NSTableView をサブクラス化し、プロトコルを宣言する
MyTableView.h
@protocol ExtendedTableViewDelegate <NSObject>
- (void)tableView:(NSTableView *)tableView didClickedRow:(NSInteger)row;
@end
@interface MyTableView : NSTableView
@property (nonatomic, weak) id<ExtendedTableViewDelegate> extendedDelegate;
@end
MyTableView.m
マウス ダウン イベントを処理します(ユーザーが外部をクリックした場合、デリゲート コールバックは呼び出されないことに注意してください。それも処理したい場合があります。その場合は、条件 " if (clickedRow != -1)
" をコメント アウトするだけです)。
- (void)mouseDown:(NSEvent *)theEvent {
NSPoint globalLocation = [theEvent locationInWindow];
NSPoint localLocation = [self convertPoint:globalLocation fromView:nil];
NSInteger clickedRow = [self rowAtPoint:localLocation];
[super mouseDown:theEvent];
if (clickedRow != -1) {
[self.extendedDelegate tableView:self didClickedRow:clickedRow];
}
}
WC、VC を ExtendedTableViewDelegate に準拠させます。
@interface MyViewController : DocumentBaseViewController<ExtendedTableViewDelegate, NSTableViewDelegate, NSTableViewDataSource>
MyTableView の extendedDelegate を WC、VC (MyViewController) に設定します
MyTableView.mのどこか
self.myTableView.extendedDelegate = self
コールバックをデリゲート (MyViewController.m) に実装します。
- (void)tableView:(NSTableView *)tableView didClickedRow:(NSInteger)row {
// have fun
}