gpt4 book ai didi

cocoa - 如何检测 NSTextField 中的双击

转载 作者:行者123 更新时间:2023-12-03 16:40:39 29 4
gpt4 key购买 nike

我有一个自定义 NSTextField,我想检测用户在文本字段中的双击。我的目标:我希望能够双击表达式中的括号,例如“(2+2) = 4”,并让它选择匹配括号内的所有内容。我想我可以用...来做到这一点

- (void)textView:(NSTextView *)textView doubleClickedOnCell:(id <NSTextAttachmentCell>)cell inRect:(NSRect)cellFrame atIndex:(NSUInteger)charIndex;

但它永远不会在我的自定义 NSTextField 中被调用。

然后我想我可以覆盖 -mouseDown,但这也没有被调用。我很困惑。关于什么应该是一个易于实现的功能的任何建议。

谢谢!

菲利普

最佳答案

文本字段本身不处理编辑。当文本字段获得焦点时,文本 View 将添加到窗口,与文本字段的区域重叠。这称为"field editor"它负责处理编辑。

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

因此,您需要实现 NSTextStorage 的子类,它重写该方法并在某些情况下返回不同的结果。 NSTextStorage 是类簇的半抽象基类。对其进行子类化需要比平常更多的东西。您必须实现 NSAttributedStringNSMutableAttributedString 的原始方法。请参阅the docs about it .

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

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

关于cocoa - 如何检测 NSTextField 中的双击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32408868/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com