在Swift中将Click Handler添加到NSTextField

时间:2015-10-19 23:17:21

标签: macos swift onclick event-handling nstextfield

我在检测用户在swift中的双击时遇到问题,我想检测他们何时双击NSTextField。

func someFunc() {
    y.target = self
    y.action = "editLabel:"
}

@IBAction func editLabel(obj:AnyObject?) {
    NSLog("here");
}

上面的代码不起作用,我似乎无法找到显示如何添加事件处理程序的基本文档。有更简单的方法吗?

2 个答案:

答案 0 :(得分:10)

我猜您的文本字段是标签,而不是正常状态下的可编辑文本字段。从OS X 10.10(Yosemite)开始,您可以使用NSClickGestureRecognizer

func applicationDidFinishLaunching(aNotification: NSNotification) {
    let gesture = NSClickGestureRecognizer()
    gesture.buttonMask = 0x1 // left mouse
    gesture.numberOfClicksRequired = 2
    gesture.target = self
    gesture.action = "editLabel:"

    myLabel.addGestureRecognizer(gesture)
}

func editLabel(sender: NSGestureRecognizer) {
    if let label = sender.view as? NSTextField {
        print("Hello world")
    }
}

答案 1 :(得分:0)

文本字段不处理编辑。当文本字段具有焦点时,文本视图将添加到窗口,与文本字段的区域重叠。这被称为"字段编辑器"它负责处理编辑。

您最有可能更改双击行为的地方是该文本视图使用的文本存储对象。 NSTextStorage继承自NSMutableAttributedString,其继承自NSAttributedString,具有 - doubleClickAtIndex:方法。该方法返回应通过双击特定索引来选择的文本范围。

因此,您希望实现一个NSTextStorage的子类来覆盖该方法,并在某些情况下返回不同的结果。 NSTextStorage是类集群的半抽象基类。对它进行子类化需要比平时多一点。您必须实现NSAttributedStringNSMutableAttributedString的原始方法。查看有关它的文档。

有一些地方可以自定义字段编辑器,方法是将文本存储对象替换为类的实例:

您可以实现NSTextFieldCell的自定义子类。设置文本字段以将其用作其单元格。在您的子类中,覆盖 - fieldEditorForView:在您的覆盖中,实例化NSTextView。获取它的layoutManager并调用 - replaceTextStorage:在其上,传递一个自定义文本存储类的实例。 (这比将文本编辑所涉及的对象的层次结构放在一起更容易,尽管您可以自己这样做。)将文本视图的fieldEditor属性设置为true并返回它。 在您的窗口委托中,实现 - windowWillReturnFieldEditor:toObject:如上所述,使用自定义文本存储创建,配置和返回NSTextView