为什么 - [NSTextStorage replaceCharactersInRange:withAttributedString:]有时,有时没有兑现在其他字符集的字体?

StackOverflow https://stackoverflow.com/questions/678620

  •  21-08-2019
  •  | 
  •  

我想在UKSyntaxColoredTextDocument 0.4 HTTP来诊断问题:/ /www.zathras.de/angelweb/blog-uksctd-oh-four.htm 这里为您键入实际上生活在一个不同的字体比你指定的文本消失。 (您可以下载并尝试这个很酷的工具来看看这个问题留给自己......)

这里的背景:这是一些语法着色代码作为你键入recolors。它的伟大工程,但如果你输入一些字符是不是该文本视图(如摩纳哥,黑体)...例如,在日本,它实际上使用的字体像ZapfDingbatsITC或符号字符或什么设置字体的一部分HiraKakuProN-W3来显示它,那么作为键入这些字符不显示。

让我们假设你有一些文字是这样的:fdsafd [☀]的SFD‡[☀☀☀] [日本语] ...

如果您粘贴到文本字段中,和语法从弹出着色之间切换,这将调用oldRecolorRange:,与此行:

[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString];

在这里,事情表现为我所期望的。该ASCII文本,符号,和日本的文字都是可见的。 [TextView的textStorage]的值开始,并结束了,这样的:(这是GDB的输出;它没有显示,不用担心该Unicode字符)

df{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}?{
    NSFont = "ZapfDingbatsITC 20.00 pt. P [] (0x001ae720) fobj=0x001bb370, spc=5.56";
}fdsafd[{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}?{
    NSFont = "HiraKakuProN-W3 20.00 pt. P [] (0x001b59e0) fobj=0x001bb600, spc=6.66";
}]sfds[{
...

...即使设置新的值设定为后

dffdsafd[?]sfds[???][???] Nihddfdfffdfdd{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}

在换句话说,以显示该字符串所需的“外来”的字体被保留自动不知何故,即使在替换字符串中没有指定的字体。

但是,当在一个字符时间键入,replaceCharactersInRange:withAttributedString:在在归因串的方法recolorRange:结果的不同的呼叫是在基本字体 - 无外来字符的字体已加入我们,所以人物出来的主要字体的范围是不可见的一切!

dffdsafd[?]sfds[???][???] Nihddfdfffdfddx{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}

任何想法,为什么这种方法将在一种情况下,而不是在另一个合作的一种方式?是否有某种类型的交换机,我可以通过给予NSTextStorage / NSAttributedString,我们希望文字显示外国字符的提示?

有帮助吗?

解决方案

尝试[[TextView的textStorage] fixFontAttributeInRange:范围];后的[[TextView的textStorage] replaceCharactersInRange:范围withAttributedString:vString]在recolorRange:

我认为问题是响应于processEditing,这已经是一个编辑的尾端再次编辑文本存储。 - [NSTextStorage processEditing]使用fixFontAttributeInRange :,但既然你想重新编辑,事情错和修复行为被丢弃。

在整个文档做,有导致fixFontAttributeInRange正常beginEditing / endEditing / processEditing序列:将被称为愉快

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top