我正在尝试检测NSTableView中何时发生鼠标单击,以及何时发生,以确定所单击的单元格的行和列。
到目前为止,我已经尝试使用NSTableViewSelectionDidChangeNotification,但是有两个问题:
有没有更好的(也是正确的)方法呢?
发布于 2013-10-29 22:38:33
要捕获用户单击行(仅当用户单击行时,而不是在以编程方式选择该行时):
子类您的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
}
发布于 2016-12-31 01:18:08
有一种简单的方法。
在macOS 10.12.2和Xcode 8.2.1上使用Swift 3.0.2进行了测试
让
tableView.action = #selector(onItemClicked)
然后
@objc private func onItemClicked() {
print("row \(tableView.clickedRow), col \(tableView.clickedColumn) clicked")
}
发布于 2013-09-05 14:43:25
我更喜欢这样做。
覆盖
-(BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row;
提供超级实现;
RequiredRow = row;
RequiredColumn = [tableView clickedColumn];
希望这能有所帮助。
https://stackoverflow.com/questions/18560509
复制相似问题