我正处于Mac OS X纯文本编辑器应用程序的计划阶段,我需要确定我需要在什么级别自定义文本系统以实现类似以下内容.这有点与语法高亮问题有关,但有一点使它非常不同.
这个纯文本编辑器的行为会很特殊.它将在用户编辑文档的同时异步解析文本,并且在文本中的某些位置,它将在用户键入时在文本中插入结构指示标记.这些幻像标记看起来像常规(可能是不同颜色的)字符,但它们不是实际文本的一部分.
例如,想一个教孩子们算术运算顺序的文本编辑器.用户输入数学表达式如3 8 * 3/9,用户将在文本视图中看到3((8 * 9)/ 9);括号将在她输入的同时出现.括号将是幻象标记,不可选择,复制文本也不包括它们.使用左右箭头键将跳过它们(例如,插入符号永远不会位于“(”或“右侧”)的左侧.).试图删除它们会导致删除之前的下一个字符.简而言之,它们将受到应用程序解析器的完全控制.
因此,从概念上讲,数据模型是用户编辑的纯文本字符串,以及解析器计算和重新生成的幻像字符的位置列表.问题是将这两个组件组合成一个文本视图,其行为与上面的示例相同.
我一般不熟悉Cocoa编程.根据您的经验,如果不诉诸核心文本,实施上述内容有多实用?是否可以通过替换一些委托或子类化NSTextLayout或其他东西?
我不希望我的文本视图做出奇怪的形状或任何东西.我只是希望它们显示不属于实际文本的字符.
解决方法
我实际上有一个非常相似的应用程序.
我使用NSLayoutManager和此代码子类化了NSTextView和overrode -drawRect:
NSRect rectOfChars = [[textView layoutManager]boundingRectForGlyphRange: [[textView layoutManager]glyphRangeForCharacterRange:arange actualCharacterRange:NULL] inTextContainer:[textView textContainer]];
…让NSRect绘制我的标记.
然后我在文本视图的委托中实现了-textView:shouldChangeTextInRange:replacementString:以在用户编辑文本时适当地调整标记.
希望这可以帮助.