Я пытаюсь диагностировать проблему в UKSyntaxColoredTextDocument 0.4 http://www.zathras.de/angelweb/blog-uksctd-oh-four.htm, где текст, который на самом деле живет шрифтом, отличным от указанного вами, исчезает при вводе. (Вы можете скачать и попробовать эту классную утилиту, чтобы увидеть эту проблему для себя ...)
Вот фон: Это некоторый синтаксический код окраски, который перекрашивается при вводе. Это прекрасно работает, но если вы вводите некоторые символы, которые не являются частью набора шрифтов для этого текстового представления (например, Monaco, Helvetica) ... например, символьный символ или что-то на японском языке, который фактически использует шрифты, такие как ZapfDingbatsITC или HiraKakuProN-W3, чтобы отобразить его, тогда эти символы не отображаются при вводе.
Допустим, у вас есть такой текст: fdsafd [☀] sfds ‡ [☀☀☀] [日本語] ...
Если вы вставите это в текстовое поле и переключитесь между цветовыми синтаксисами из всплывающего окна, это вызовет oldRecolorRange:
с этой строкой:
[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString];
Здесь все идет так, как я и ожидал. Текст ASCII, символы и японский текст все видимы. Значение [textView textStorage] начинается и заканчивается примерно так: (Это вывод gdb; он не показывает символы Юникода, не беспокойтесь об этом.)
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:
приводит к атрибутной строке, которая only в базовом шрифте - без иностранного Для нас добавлены шрифты -character, поэтому символы вне диапазона основного шрифта вообще не видны!
dffdsafd[?]sfds[???][???] Nihddfdfffdfddx{
NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}
Есть идеи, почему этот метод работал бы в одном случае, а не в другом? Есть ли какой-то переключатель, который я могу передать, чтобы дать NSTextStorage
/ NSAttributedString
подсказку, что мы хотим, чтобы текст отображал иностранные символы?