Como eu sei quando um atributo anexo está sendo adicionado à minha NSTextView?
-
06-07-2019 - |
Pergunta
Por causa da semântica de certos anexos NSTextView no meu aplicativo, eu quero saber quando eles são inseridos ou apagados do meu armazenamento de texto.
O meu subclasse de NSTextView implementa o shouldChangeTextInRange: replacementString: método, que me permite ver facilmente quando um anexo está prestes a ser substituído (posso pesquisar o armazenamento de texto no intervalo especificado)
.Como a cadeia de substituição é apenas um NSString e não um NSAttributedString, eu não tenho nenhuma maneira de ver a partir deste método se um anexo está sendo inserido. A documentação vai ainda mais longe ao dizer que o texto poderá ser nulo se "somente atributos" estão sendo editadas.
Então a questão é, qual é o melhor ponto de override para ver quando um anexo está sendo inserido? Ou talvez tão útil: qual é o melhor ponto de override para ver quando atributos estão sendo modificados
Update: eu disse acima eu não tinha nenhuma maneira de saber se um anexo está sendo inserido. É apontado para mim que eu posso dizer que "um" apego está envolvido, porque a cadeia irá conter a magia NSAttachmentCharacter. Mas eu não vou ter informações específicas sobre o anexo até que a edição está completa.
Solução
Gostaria de ter um olhar para o -textStorageDidProcessEditing método delegado NSTextStorage :, que deve ser chamado cada vez que uma alteração é feita para o armazenamento de texto subjacente. Você pode então usar o -editedRange, -editedMask e métodos -changeInLength para determinar que parte do armazenamento de texto foi alterado, e olhar nesse intervalo para quaisquer anexos que possam ser de seu interesse.
Outras dicas
Você pode querer dar uma olhada em dois métodos NSTextStorage
delegado:
- (void)textStorageWillProcessEditing:(NSNotification *)notification;
/* Delegate can change the characters or attributes */
- (void)textStorageDidProcessEditing:(NSNotification *)notification;
/* Delegate can change the attributes */
Dentro textStorageWill/DidProcessEditing
, você pode chamar -[NSTextStorage editedMask]
e -[NSTextStorage editedRange]
para descobrir o que mudou e então agir em conformidade.