Итак, я пытаюсь заставить свой NSTextView синтаксис выделить некоторую уценку. Вот как это выглядит:
но когда я нажимаю клавишу удаления, происходит следующее:
Кто-нибудь знает, что происходит?
В моем делегате - (void)textStorageDidProcessEditing:(NSNotification *)notification
я выполняю полный синтаксический анализ текста, и у меня есть словарь, содержащий следующие записи:
@"paragraph": @{NSFontAttributeName: bodyFont,
NSUnderlineStyleAttributeName: @(NSUnderlineStyleNone),
NSForegroundColorAttributeName: paragraphColor}
способ, которым я применяю форматирование:
- (void) applyThemeIfRequired:(NSDictionary*)token {
NSRange tokenRange = (NSRange)[token[@"range"] rangeValue];
NSRange effectiveRange;
NSTextStorage* storage = _textView.textStorage;
NSDictionary* themeForToken = _theme[token[@"type"]];
if (themeForToken) {
[themeForToken enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
id prop = [storage attribute:key atIndex:tokenRange.location effectiveRange:(NSRangePointer)&effectiveRange];
if (![prop isEqualTo: obj] || ([prop isEqualTo:obj] && NSMaxRange(effectiveRange) < NSMaxRange(tokenRange))) {
[storage addAttribute:key value:obj range:tokenRange];
[storage fixAttributesInRange:tokenRange];
}
}];
}
}
Я обнаружил, что если я начинаю добавлять атрибуты ко всей строке, это вызывает эту ошибку, и хотя приведенный выше код хорошо обрабатывает элементы уровня блока (т.е. когда стили применяются ко всей строке), он перезапускает эту проблему, если атрибуты находятся в пределах строк.
Еще несколько интересных деталей:
У каретки нет проблем при вставке текста
Если вы удалите первый (и единственный) символ в строке, сделав его пустой строкой, точка вставки займет правильное место.
Расположение курсора в столбце (оси X) всегда правильное, только значение оси Y не соответствует действительности.
по большей части, если вы редактируете документ до того места, где был применен последний стиль, эта проблема не проявляется, пример ее ниже. Здесь я только что удалил букву «g», но с кареткой все в порядке. Итак, единственная проблема заключается в редактировании внутри или после последнего выделенного текста.
Извините, что этот вопрос слишком длинный, но спросите, не упустил ли я что-нибудь. Спасибо за помощь!