【问题标题】:Adding Click Handler to NSTextField in Swift在 Swift 中向 NSTextField 添加点击处理程序
【发布时间】:2015-10-19 23:17:20
【问题描述】:

我无法快速检测用户的双击,我想检测他们何时双击 NSTextField。

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

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

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

【问题讨论】:

    标签: macos swift onclick event-handling nstextfield


    【解决方案1】:

    我猜您的文本字段是一个标签,而不是正常状态下的可编辑文本字段。从 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")
        }
    }
    

    【讨论】:

    • 你知道如何在 OS X 10.9 上做同样的事情吗?
    • @IhorSkliar 你找到解决方案了吗?由于此代码在 OS 10.14.4 中对我来说运行良好。尽管可以通过以下方式减少线条 - let gesture = NSClickGestureRecognizer(target: self, action: #selector(button_Cliecked(editLabel:)))
    【解决方案2】:

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

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

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

    有几个地方可以通过将其文本存储对象替换为您的类的实例来自定义字段编辑器:

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

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多