Come faccio a sapere quando viene aggiunto un attributo allegato al mio NSTextView?
-
06-07-2019 - |
Domanda
A causa della semantica di alcuni allegati NSTextView nella mia applicazione, voglio sapere quando vengono inseriti o eliminati dalla mia memoria di testo.
La mia sottoclasse di NSTextView implementa il metodo shouldChangeTextInRange: replacementString: che mi permette di vedere facilmente quando un allegato sta per essere sostituito (posso cercare nella memoria di testo nell'intervallo specificato).
Poiché la stringa di sostituzione è solo una NSString e non una NSAttributedString, non ho modo di vedere da questo metodo se viene inserito un allegato. La documentazione arriva persino a dire che la stringa può essere nulla se "solo attributi" sono in fase di modifica.
Quindi la domanda è: qual è il miglior punto di override da vedere quando viene inserito un allegato? O forse altrettanto utile: qual è il miglior punto di override da vedere quando gli attributi vengono modificati?
Aggiornamento: ho detto sopra che non avevo modo di sapere se veniva inserito un allegato. Mi è stato fatto notare che posso dire che "un" l'allegato è coinvolto, poiché la stringa conterrà il NSAttachmentCharacter magico. Ma non avrò informazioni specifiche sull'allegato fino a quando la modifica non sarà completa.
Soluzione
Vorrei dare un'occhiata al metodo delegato NSTextStorage -textStorageDidProcessEditing :, che dovrebbe essere chiamato ogni volta che viene apportata una modifica alla memoria di testo sottostante. Puoi quindi utilizzare i metodi -editedRange, -editedMask e -changeInLength per determinare quale sezione della memoria di testo è stata modificata e cercare in tale intervallo eventuali allegati che potrebbero interessarti.
Altri suggerimenti
Potresti dare un'occhiata a due metodi delegati NSTextStorage
:
- (void)textStorageWillProcessEditing:(NSNotification *)notification;
/* Delegate can change the characters or attributes */
- (void)textStorageDidProcessEditing:(NSNotification *)notification;
/* Delegate can change the attributes */
All'interno di textStorageWill / DidProcessEditing
, puoi chiamare - [NSTextStorage editingMask]
e - [NSTextStorage editingRange]
per scoprire cosa è cambiato e quindi agire di conseguenza.