Как узнать, когда атрибут вложения добавляется в мой NSTextView? - PullRequest
8 голосов
/ 23 октября 2009

Из-за семантики некоторых вложений NSTextView в моем приложении я хочу знать, когда они будут вставлены или удалены из моего текстового хранилища.

Мой подкласс NSTextView реализует метод shouldChangeTextInRange: replaceString:, который позволяет мне легко увидеть, когда вложение собирается заменить (я могу искать в хранилище текста в указанном диапазоне).

Поскольку замещающая строка является просто NSString, а не NSAttributedString, у меня нет никакого способа увидеть из этого метода, вставляется ли вложение. В документации даже говорится, что строка может быть нулевой, если редактируются «только атрибуты».

Итак, вопрос в том, какую точку переопределения лучше всего видеть при вставке вложения? Или, может быть, так же полезно: какую точку переопределения лучше всего увидеть при изменении атрибутов?

Обновление: я сказал выше, что у меня нет возможности узнать, вставляется ли вложение. Мне было указано, что я могу сказать, что вложение "an" включено, потому что строка будет содержать магический NSAttachmentCharacter. Но у меня не будет конкретной информации о вложении до тех пор, пока редактирование не будет завершено.

Ответы [ 2 ]

4 голосов
/ 23 октября 2009

Я бы взглянул на метод делегата NSTextStorage -textStorageDidProcessEditing:, который следует вызывать каждый раз, когда вносятся изменения в базовое хранилище текста. Затем вы можете использовать методы -editedRange, -editedMask и -changeInLength, чтобы определить, какой раздел хранилища текста был изменен, и найти в этом диапазоне любые вложения, которые могут вас заинтересовать.

2 голосов
/ 23 октября 2009

Возможно, вы захотите взглянуть на два 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], чтобы выяснить, что изменилось, и затем принять соответствующие меры.

...