Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使用Cocoa文本系统的幻影字符_Macos_Cocoa_Text_View - Fatal编程技术网

Macos 使用Cocoa文本系统的幻影字符

Macos 使用Cocoa文本系统的幻影字符,macos,cocoa,text,view,Macos,Cocoa,Text,View,我正处于MacOSX纯文本编辑器应用程序的规划阶段,我需要确定在什么级别上需要自定义文本系统,以实现以下目标。这在某种程度上与语法突出显示的问题有关,但有一件事使它非常不同 此纯文本编辑器的行为将是特殊的。它将在用户编辑文档的同时异步解析文本,并在文本中的某些位置插入结构,指示用户键入时文本中的标记。这些幻影标记看起来像普通字符(可能颜色不同),但它们不是实际文本的一部分 例如,想象一个文本编辑器,它教孩子们算术运算的顺序。用户将键入一个数学表达式,如3+8*3/9,用户将在文本视图中看到3+(

我正处于MacOSX纯文本编辑器应用程序的规划阶段,我需要确定在什么级别上需要自定义文本系统,以实现以下目标。这在某种程度上与语法突出显示的问题有关,但有一件事使它非常不同

此纯文本编辑器的行为将是特殊的。它将在用户编辑文档的同时异步解析文本,并在文本中的某些位置插入结构,指示用户键入时文本中的标记。这些幻影标记看起来像普通字符(可能颜色不同),但它们不是实际文本的一部分

例如,想象一个文本编辑器,它教孩子们算术运算的顺序。用户将键入一个数学表达式,如3+8*3/9,用户将在文本视图中看到3+((8*9)/9);括号将在她键入的同时出现。括号将是幻影标记,不可选择,复制文本也不会包含它们。使用左箭头键和右箭头键将跳过它们(例如,插入符号不能位于“(“或“)”的右侧”)。尝试删除它们会导致删除前一个字符。简言之,它们将完全由应用程序的解析器控制

因此,从概念上讲,数据模型是用户编辑的纯文本字符串和解析器计算并重新生成的幻像字符位置列表。问题是将这两个组件组合到一个文本视图中,该视图的行为与上面的示例相同

一般来说,我不熟悉Cocoa编程。根据您的经验,在不诉诸核心文本的情况下实现上述内容有多实际?是否可以替换某些委托或子类化NSTextLayout或其他内容


我不想我的文本视图做奇怪的形状或任何事情。我只想让它们显示不属于实际文本的字符。

看看NSLayoutManager,特别是
-drawGlyphsForGlyphRange:atPoint:
我实际上有一个做得非常类似的应用程序

我使用
NSLayoutManager
NSTextView
进行了子类化,并覆盖了
-drawRect:
,此代码

NSRect rectOfChars = [[textView layoutManager]boundingRectForGlyphRange: [[textView layoutManager]glyphRangeForCharacterRange:arange actualCharacterRange:NULL] inTextContainer:[textView textContainer]];
…获取NSRect以绘制我的标记

然后,我在我的文本视图的委托中实现了
-textView:shouldChangeTextInRange:replacementString:
,以便在用户编辑文本时适当调整标记

希望这有帮助