我有一个基于视图的NSTableView
。表中的每个视图都有一个自定义文本字段。
当用户点击表格视图中的文本字段(标签)时,我想触发一个动作(假设在每个表格单元格中都有一个带有自定义动作的超链接)。
我创建了一个基本的NSTextField
子类来捕获鼠标事件。但是,它们仅在第二次单击时触发,而不是第一次单击。
我尝试使用NSButton
并立即开火。
以下是自定义标签的代码:
@implementation HyperlinkTextField
- (void)mouseDown:(NSEvent *)theEvent {
NSLog(@"link mouse down");
}
- (void)mouseUp:(NSEvent *)theEvent {
NSLog(@"link mouse up");
}
- (BOOL)acceptsFirstResponder {
return YES;
}
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent {
return YES;
}
@end
答案 0 :(得分:7)
有同样的问题。这里接受的答案对我不起作用。经过多次努力之后,当我选择“无”而不是默认的“常规”时,神奇地工作,而另一个选项是IB中表格视图的“突出显示”选项的“源列表”!
编辑:接受的答案结果是误导,因为方法是为表视图重载而不是文本字段,如答案所示。在https://stackoverflow.com/a/13579469/804616更清楚地给出了它,但无论如何,更具体的感觉有点hacky。
答案 1 :(得分:6)
事实证明,NSTableView
和NSOultineView
处理NSTextField
个实例的第一个响应者状态的方式与NSButton
不同。
在我的自定义文字字段类的情况下,让标签响应第一次点击(如按钮)的关键是覆盖[NSResponder validateProposedFirstResponder:forEvent:]
以返回YES
。
文档:
答案 2 :(得分:1)
您看到的行为是因为表视图是第一个响应者,它应该是,或者当您单击标签时行不会更改 - 这是用户在单击时所期望的行为一排桌子。我认为不是子类化标签,而是将表视图子类化并覆盖mouseDown:更好。在调用了super的mouseDown:的实现之后,你可以进行命中测试来检查用户是否点击了标签。
@implementation CustomTable
- (void)mouseDown:(NSEvent *)theEvent
{
[super mouseDown:theEvent];
NSPoint point = [self convertPoint:theEvent.locationInWindow fromView:nil];
NSView *theView = [self hitTest:point];
if ([theView isKindOfClass:[NSTextField class]])
{
NSLog(@"%@",[(NSTextField *)theView stringValue]);
}
}
@end
答案 3 :(得分:1)
在完全相同的情况下,将NSButton
嵌入transparent
设置为true/YES
为我工作。
class LinkButton: NSTextField {
var clickableButton:NSButton?
override func viewDidMoveToSuperview() {
let button = NSButton()
self.addSubview(button)
//setting constraints to cover the whole textfield area (I'm making use of SnapKit here, you should add the constraints your way or use frames
button.snp_makeConstraints { (make) -> Void in
make.edges.equalTo(NSEdgeInsetsZero)
}
button.target = self
button.action = Selector("pressed:")
button.transparent = true
}
func pressed(sender:AnyObject) {
print("pressed")
}
答案 4 :(得分:0)
使用window.makeFirstResponser(myTextfield)开始编辑文本字段。您从覆盖mouseDown(withEvent TheEvent:NSEvent)方法
发送此消息