在Swift中添加Click Handler到NSTextField

问题描述:

我在检测用户在swift中的双击时遇到了问题,我想要检测它们何时双击NSTextField。在Swift中添加Click Handler到NSTextField

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

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

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

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

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

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

有几个地方用你的类的实例代替文本存储对象自定义字段编辑器:

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

我猜你的文本字段是标签,而不是正常状态下的可编辑文本字段。从OS X 10.10(优胜美地)开始,您可以使用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") 
    } 
}