可可 – NSTableView:检测与行和列一起的鼠标点击

我试图检测在NSTableView中什么时候发生鼠标点击,如果是这样,确定单击的单元格的行和列.

到目前为止,我试图使用NSTableViewSelectionDidChangeNotification,但是有两个问题:

>它只会在选择更改时触发,而我希望每次鼠标点击,即使它在当前选定的行.
>当我的委托被调用时,NSTableView的clickedRow和clickedColumn属性都是-1.

有没有更好的(和正确的)这样做的方式?

捕获用户点击一行(仅当用户单击一行时,不是以编程方式选择):

将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
}
相关文章
相关标签/搜索