mouseDown:在NSTableView内的自定义NSTextField中

时间:2012-03-23 14:52:15

标签: cocoa nstableview nstextfield

我有一个基于视图的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

5 个答案:

答案 0 :(得分:7)

有同样的问题。这里接受的答案对我不起作用。经过多次努力之后,当我选择“无”而不是默认的“常规”时,神奇地工作,而另一个选项是IB中表格视图的“突出显示”选项的“源列表”!

编辑:接受的答案结果是误导,因为方法是为表视图重载而不是文本字段,如答案所示。在https://stackoverflow.com/a/13579469/804616更清楚地给出了它,但无论如何,更具体的感觉有点hacky。

答案 1 :(得分:6)

事实证明,NSTableViewNSOultineView处理NSTextField个实例的第一个响应者状态的方式与NSButton不同。

在我的自定义文字字段类的情况下,让标签响应第一次点击(如按钮)的关键是覆盖[NSResponder validateProposedFirstResponder:forEvent:]以返回YES

文档:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/NSResponder/validateProposedFirstResponder:forEvent

答案 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)方法

发送此消息