令牌文本字段,如Numbers

时间:2012-06-27 12:23:06

标签: objective-c cocoa nstextfield appkit nstokenfield

我希望有一个文本字段,如Numbers中的表达式编辑器文本字段:

enter image description here

它与NSTokenField非常相似,但NSTokenField仅支持分隔符分隔的标记列表,例如Mail.app中的“收件人:”字段。

enter image description here

我必须将这些令牌嵌入到特定位置的文本中,否则它们的工作方式与NSTokenField完全相同(退格会删除令牌,您可以将它们拖动等等。)

是否有任何第一方或第三方控件可以执行此类操作?我没找到任何东西。

如果没有,您会如何推荐实施?使用核心文本并重新发明轮子(使用更好的令牌支持实现NSTextField)?或者有更好的解决方案吗?

1 个答案:

答案 0 :(得分:6)

我认为NSTokenField没有替代控件可用(好吧,几周前我找不到一个)。

可能的选择可能是遵循Apple示例项目LayoutManagerDemo中提供的解决方案。这显示了NSTextView的子类,能够检测文本上的鼠标移动。安装并运行演示以获得基本想法。

该示例使用NSLayoutManager来检测鼠标移动,但代码可能适用于检测文本中的特定字符序列,例如文本字段中的标记。从NSLocationManager获得令牌及其位置后,您可以根据令牌的特征插入自己的代表。一种可能的解决方案是使用NSTextAttachmentCell,它将成为文本中的字形。使用NSTextAttachmentCell的好处是它被Cocoa的文本系统视为一个字形(您可以选择它,它遵循格式化等)。通过实施drawWithFrame:inView:,您可以添加每个令牌的各种可见属性。