Какао: ищу общую стратегию для программного манипулирования хранилищем NSTextView без беспорядочной отмены

Я пишу специальный текстовый редактор на какао, который выполняет такие вещи, как автоматическая подстановка текста, встроенные дополнения текста (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 ?

15
задан Regexident 23 May 2013 в 19:52
поделиться