objective-c - 像 Numbers 中的标记文本字段

标签 objective-c cocoa nstextfield appkit nstokenfield

我想要一个文本字段,例如 Numbers 中的表达式编辑器文本字段:

enter image description here

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

enter image description here

我必须将这些标记嵌入到特定位置的文本中,但除此之外,它们的工作方式与 NSTokenField 完全相同(退格删除标记,您可以将它们拖来拖去等)。

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

如果没有,您建议如何实现?使用 Core Text 并重新发明轮子(实现具有更好 token 支持的 NSTextField)?或者有更好的解决方案吗?

最佳答案

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

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

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

关于objective-c - 像 Numbers 中的标记文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226106/

相关文章:

ios - 核心数据 : Set Managed Object Context from AppDelegate for app with UITabBarController

cocoa - 使用 Cocoa 打开文档

cocoa - Swift:尝试在循环中更新 NSTextField,但它只获取最后一个值

ios - 从 Objective C 调用 Swift 中定义的 NSString 扩展

iOS:Swift:Core 数据:不使用私有(private) ManagedObjectContext 存储值

ios - 在 Facebook 上发布状态

macos - NSTextView : how to subclass, 覆盖 -mouseDown 并且仍然能够选择文本?

objective-c - Cocoa 中的文件共享发现

objective-c - 如何在 OS X 中关闭完成提示(NSTextFiled 和 NSTextView)

objective-c - 带有内置验证的 NSTextField