Какой метод замены вызывается при редактировании приписанной строки? - PullRequest
1 голос
/ 17 марта 2019

NSMutableAttributedString определяет два метода замены строк:

func replaceCharacters(in range: NSRange, 
                       with str: String)

и

func replaceCharacters(in range: NSRange, 
                with attrString: NSAttributedString)

Я создал подкласс NSTextStorage, который, в свою очередь,является подклассом NSMutableAttributedString.В этом подклассе я переопределил оба вышеупомянутых метода.

К моему удивлению, последний метод (который передает приписанную строку замены) никогда не вызывается, когда я набираю или вставляю что-то в мое текстовое представление.Каждый раз вызывается только метод замены простой строки.

Это приводит меня к вопросу: На основании каких правил эти два метода фактически называются , когда пользователь редактирует текст в текстовом представлении?

(мне нужно выполнять различные операции в моем хранилище текста, в зависимости от того,приписанная замещающая строка содержит определенный тип текстового вложения. Но если метод замены приписанной строки никогда не вызывается, я не вижу способа сделать это различие. ?)

1 Ответ

2 голосов
/ 17 марта 2019

Функция

func replaceCharacters(in range: NSRange, 
                with attrString: NSAttributedString)

на самом деле никогда не вызывается.

Из документации (ниже) ясно, что следует использовать комбинацию replaceCharactersInRange:withString: с последующим вызовом setAttributes:range:

/ * Примечание для создания подкласса NSTextStorage: NSTextStorage является полуабстрактный подкласс NSMutableAttributedString. Это реализует управление изменениями (beginEditing / endEditing), проверка атрибуты, обработка делегатов и уведомление об управлении макетом. один аспект, который он не реализует, является фактической приписанной строкой хранилище --- это оставлено до субклассеров, которые должны переопределить два примитива NSMutableAttributedString в дополнение к двум Примитивы NSAttributedString:

  • (NSString *) строка;
  • (NSDictionary *) attributeAtIndex: (NSUInteger) расположение, эффективный диапазон: (NSRangePointer) диапазон;

  • (void) replaceCharactersInRange: диапазон (NSRange) withString: (NSString *) str;

  • (void) setAttributes: (NSDictionary *) attrs range: (NSRange) range; Эти примитивы должны выполнить изменение, затем вызвать отредактировано: range: changeInLength: чтобы все остальное произошло. * /

Убедитесь, что у вас есть пользовательская реализация этих методов.

И это также как AppKit реализует NSTextView:

enter image description here

...