Как узнать, когда атрибут вложения добавляется в мой NSTextView?
-
06-07-2019 - |
Вопрос
Из-за семантики некоторых вложений NSTextView в моем приложении я хочу знать, когда они будут вставлены или удалены из моего текстового хранилища.
Мой подкласс NSTextView реализует метод shouldChangeTextInRange: replaceString:, который позволяет мне легко увидеть, когда вложение должно быть заменено (я могу искать в хранилище текста в указанном диапазоне).
Поскольку замещающая строка - это просто NSString, а не NSAttributedString, у меня нет способа увидеть из этого метода, вставляется ли вложение. В документации даже говорится, что строка может быть нулевой, если «только атрибуты» редактируются.
Итак, вопрос в том, какую точку переопределения лучше всего видеть при вставке вложения? Или, может быть, так же полезно: какую точку переопределения лучше всего увидеть при изменении атрибутов?
Обновление: я сказал выше, что у меня нет возможности узнать, вставляется ли вложение. Мне сказали, что я могу сказать, что " вложение участвует, потому что строка будет содержать магический NSAttachmentCharacter. Но у меня не будет конкретной информации о вложении до тех пор, пока редактирование не будет завершено.
Решение
Я хотел бы взглянуть на метод делегата NSTextStorage -textStorageDidProcessEditing:, который следует вызывать каждый раз, когда вносятся изменения в базовое хранилище текста. Затем вы можете использовать методы -editedRange, -editedMask и -changeInLength, чтобы определить, какой раздел хранилища текста был изменен, и найти в этом диапазоне любые вложения, которые могут вас заинтересовать.
Другие советы
Возможно, вы захотите взглянуть на два метода делегирования NSTextStorage
:
- (void)textStorageWillProcessEditing:(NSNotification *)notification;
/* Delegate can change the characters or attributes */
- (void)textStorageDidProcessEditing:(NSNotification *)notification;
/* Delegate can change the attributes */
Внутри textStorageWill / DidProcessEditing
вы можете вызывать - [NSTextStorage editedMask]
и - [NSTextStorage editedRange]
, чтобы узнать, что изменилось, а затем принять соответствующие меры.