我在检测用户在swift中的双击时遇到问题,我想检测他们何时双击NSTextField。
func someFunc() {
y.target = self
y.action = "editLabel:"
}
@IBAction func editLabel(obj:AnyObject?) {
NSLog("here");
}
上面的代码不起作用,我似乎无法找到显示如何添加事件处理程序的基本文档。有更简单的方法吗?
答案 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
是类集群的半抽象基类。对它进行子类化需要比平时多一点。您必须实现NSAttributedString
和NSMutableAttributedString
的原始方法。查看有关它的文档。
有一些地方可以自定义字段编辑器,方法是将文本存储对象替换为类的实例:
您可以实现NSTextFieldCell
的自定义子类。设置文本字段以将其用作其单元格。在您的子类中,覆盖 - fieldEditorForView
:在您的覆盖中,实例化NSTextView
。获取它的layoutManager并调用 - replaceTextStorage
:在其上,传递一个自定义文本存储类的实例。 (这比将文本编辑所涉及的对象的层次结构放在一起更容易,尽管您可以自己这样做。)将文本视图的fieldEditor属性设置为true并返回它。
在您的窗口委托中,实现 - windowWillReturnFieldEditor:toObject
:如上所述,使用自定义文本存储创建,配置和返回NSTextView
。