首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NSTableView:检测鼠标单击以及行和列

NSTableView:检测鼠标单击以及行和列
EN

Stack Overflow用户
提问于 2013-09-02 00:35:38
回答 6查看 19.2K关注 0票数 28

我正在尝试检测NSTableView中何时发生鼠标单击,以及何时发生,以确定所单击的单元格的行和列。

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

  1. 它仅在选择更改时触发,而我希望每次单击鼠标时,即使是在当前选定的行上。
  2. 调用委托时,NSTableView的clickedRow和clickedColumn属性都为-1。

有没有更好的(也是正确的)方法呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-10-29 22:38:33

要捕获用户单击行(仅当用户单击行时,而不是在以编程方式选择该行时):

子类您的NSTableView并声明一个协议

MyTableView.h

代码语言:javascript
复制
@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)")

代码语言:javascript
复制
- (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

代码语言:javascript
复制
@interface MyViewController : DocumentBaseViewController<ExtendedTableViewDelegate, NSTableViewDelegate,  NSTableViewDataSource>

将MyTableView的extendedDelegate设置为您的WC,VC (MyViewController)

MyTableView.m中的某处

代码语言:javascript
复制
self.myTableView.extendedDelegate = self

在委托(MyViewController.m)中实现回调

代码语言:javascript
复制
- (void)tableView:(NSTableView *)tableView didClickedRow:(NSInteger)row {
    // have fun
}
票数 27
EN

Stack Overflow用户

发布于 2016-12-31 01:18:08

有一种简单的方法。

在macOS 10.12.2和Xcode 8.2.1上使用Swift 3.0.2进行了测试

代码语言:javascript
复制
tableView.action = #selector(onItemClicked)

然后

代码语言:javascript
复制
@objc private func onItemClicked() {
    print("row \(tableView.clickedRow), col \(tableView.clickedColumn) clicked")
}
票数 69
EN

Stack Overflow用户

发布于 2013-09-05 14:43:25

我更喜欢这样做。

覆盖

代码语言:javascript
复制
-(BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row;

提供超级实现;

代码语言:javascript
复制
RequiredRow = row;
RequiredColumn = [tableView clickedColumn];

希望这能有所帮助。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18560509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档