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

StackOverflow https://stackoverflow.com/questions/1614419

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top