Точка вставки не отображается в нужном месте после удаления

Итак, я пытаюсь заставить свой 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», но с кареткой все в порядке. Итак, единственная проблема заключается в редактировании внутри или после последнего выделенного текста. введите описание изображения здесь

Извините, что этот вопрос слишком длинный, но спросите, не упустил ли я что-нибудь. Спасибо за помощь!


person Mutahhir    schedule 28.11.2013    source источник


Ответы (1)


Итак, я нашел решение:

Я вызвал свой метод parse из метода -textStorageWillProcessEditing:, и по какой-то причине NSAttributedString не нравится, что его атрибуты изменяются в реальном времени. Таким образом, использование -performSelector:withObject:afterDelay для вызова селектора parse с задержкой 0,0 решает проблему.

Однако редактирование атрибутов NSTextStorage в отложенном селекторе приводит к тому, что селектор -textStorageWillProcessEditing: вызывается снова и снова. Поэтому вы должны проверить это с помощью алгоритма, который не выполняет синтаксический анализ, когда контент уже полностью проанализирован.

person Mutahhir    schedule 29.11.2013