Я пишу специальный текстовый редактор в cocoa, который выполняет такие функции, как автоматическая подмена текста, встроенные текстовые дополнения (ala Xcode) и т.д.
Мне нужно иметь возможность программно манипулировать NSTextView
s NSTextStorage
в ответ на 1) ввод данных пользователя, 2) вставка пользователя, 3) удаление пользователем текста.
Я пробовал два разных общих подхода, и оба они вызвали отладчик NSTextView
, который был отключен от синхронизации по-разному. В каждом случае я использую только методы NSTextView
delegate. Я пытался избежать подклассификации NSTextView
или NSTextStorage
(хотя я буду подклассифицировать, если необходимо).
Первый подход, который я пробовал, выполнял манипуляции из метода textView
delegate
s textDidChange
. Из этого метода я проанализировал, что было изменено в textView
, а затем вызвал метод общего назначения для модификации текста, который обернул изменения в textStorage вызовами shouldChangeTextInRange:
и didChangeText:
. Некоторые из программных изменений допускали чистые отмены, но некоторые не делали.
Второй (и, возможно, более интуитивно понятный, поскольку он вносит изменения до того, как текст действительно появляется в подходе textView
), который я пытался, делал манипуляции из метода delegate
s shouldChangeTextInRange:
, снова используя ту же общую цель способ хранения, который переносит изменения в хранилище с вызовом shouldChangeTextInRange:
и didChangeText:
. Поскольку эти изменения запускались изначально из shouldChangeTextInRange:
, я устанавливал флаг, который указывал, что внутренний вызов shouldChangeTextInRange:
игнорируется, чтобы не вводить рекурсивную черноту. Опять же, некоторые из программных изменений допускали чистые отмены, но некоторые из них (хотя и разные на этот раз и по-разному).
Со всем этим фоном, на мой вопрос, может ли кто-нибудь указать мне общую стратегию для программного управления хранилищем NSTextView
, которая будет содержать диспетчер отмены в чистоте и в синхронизации?
В каком методе делегата NSTextView
следует обратить внимание на текстовые изменения в textView (путем ввода, вставки или удаления) и выполнить манипуляции с NSTextStorage
? Или это единственный способ сделать это путем подклассификации либо NSTextView
, либо NSTextStorage
?