Почему -[NSTextStorage заменяет charactersinrange:withAttributedString:] иногда, иногда не соблюдаются шрифты в других наборах символов?

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

  •  21-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь диагностировать проблему в UKSyntaxColoredTextDocument 0.4 http://www.zathras.de/angelweb/blog-uksctd-oh-four.htm где текст, который на самом деле написан шрифтом, отличным от указанного вами, исчезает по мере ввода.(Вы можете скачать и опробовать эту классную утилиту, чтобы убедиться в этой проблеме самостоятельно ...)

Вот предыстория:Это некоторый код раскраски синтаксиса, который перекрашивается по мере ввода.Это отлично работает, но если вы введете некоторые символы, которые не являются частью набора шрифтов для этого текстового представления (напримерМонако, Гельветика) ...например, символ или что-то еще на японском языке, для отображения которого фактически используются шрифты типа ZapfDingbatsITC или HiraKakuProN-W3, тогда эти символы не отображаются при вводе.

Допустим, у вас есть какой-то текст, подобный этому:fdsafd[☀]сфдс‡[☀☀☀☀][日日本語]...

Если вы вставите это в текстовое поле и переключитесь между раскрасками синтаксиса из всплывающего окна, это вызовет 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: приводит к появлению приписываемой строки, которая является Только в базовом шрифте - для нас не было добавлено шрифтов с иностранными символами, поэтому символы вне диапазона основного шрифта вообще не видны!

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

Есть какие-нибудь идеи, почему этот метод будет работать так в одних обстоятельствах, а не в других?Есть ли какой-то переключатель, который я могу передать, чтобы дать NSTextStorage/NSAttributedString намек на то, что мы хотим, чтобы в тексте отображались иностранные символы?

Это было полезно?

Решение

Попробуйте [[TextView textStorage] Исправить fontattributeinrange:диапазон];после [[TextView textStorage] замените charactersinrange:диапазон с атрибутированной строкой:VString] в изменении цвета:

Я думаю, проблема заключается в повторном редактировании текстового хранилища в ответ на processEditing , который уже является завершающим этапом редактирования.-[NSTextStorage processEditing] использует fixFontAttributeInRange: , но поскольку вы пытаетесь отредактировать снова, что-то идет не так, и исправление поведения отбрасывается.

Когда вы делаете это для всего документа, возникает обычная последовательность beginEditing /endEditing /processEditing, которая вызывает fixFontAttributeInRange:чтобы тебя называли счастливым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top