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