28

NSTableView でマウス クリックが発生したタイミングを検出し、クリックされたセルの行と列を特定しようとしています。

これまで NSTableViewSelectionDidChangeNotification を使用しようとしましたが、2 つの問題があります。

  1. 選択が変更されたときにのみトリガーされますが、現在選択されている行であっても、すべてのマウスクリックが必要です。
  2. NSTableView の clickedRow プロパティと clickedColumn プロパティは、デリゲートが呼び出されたときに両方とも -1 です。

これを行うためのより良い(そして正しい)方法はありますか?

4

6 に答える 6

27

行をクリックしているユーザーをキャッチするには (ユーザーが行をクリックしたときのみであり、プログラムで選択されたときではありません):

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
}
于 2013-10-29T14:38:33.033 に答える
9

私は次のようにすることをお勧めします。

オーバーライド

-(BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row;

スーパー実装を提供します。

RequiredRow = row;
RequiredColumn = [tableView clickedColumn];

お役に立てれば。

于 2013-09-05T06:43:24.557 に答える
-2

tableViewSelectionIsChanging通知を参照してください。NSTableView.h からのコメントは次のとおりです。

/* オプション - 選択が変更されようとしているときに呼び出されますが、tableViewSelectionIsChanging: はマウス イベントが選択を変更しているときにのみ呼び出され、キーボード イベントでは呼び出されないことに注意してください。*/

これがマウス クリックを関連付ける最も確実な方法ではないことは認めますが、マウス クリックに関心があることを確認すると、別の領域を調査する必要があります。

于 2014-11-29T17:09:50.097 に答える