[Résolu] textStorage addAttribute et KVO

berfisberfis Membre
juin 2015 modifié dans API AppKit #1

Bonjour,


 


Un petit problème qui m'agace depuis quelques jours:


 


J'ai une NSTextView qui affiche la propriété (NSAttributedString) d'un objet. J'offre la possibilité à  l'utilisateur de créer (un peu à  la manière de Pages) un lien vers un autre objet similaire en sélectionnant une partie du texte, puis en choisissant l'objet auquel relier le texte sélectionné.


 


Cela fonctionnerait à  ravir si (et seulement si) le fait de rajouter le lien signalait à  l'objet "émetteur" que son texte a été modifié. Or, le fait d'effectuer:



[[self.textView textStorage] addAttribute: NSLinkAttributeName value: destination.objectID.URIRepresentation range:[self.textView selectedRange]];

n'indique aucune modification de la propriété, et donc le lien n'est pas enregistré.


 


J'ai essayé d'inclure cette modification entre "willChange/didChangeValueForKey", entre "beginEditing/endEditing", sans résultat. En fait, il me faudrait faire l'équivalent d'une modification du texte au clavier, "salir" le contenu de la NSTextView. Avant de faire d'autres bêtises, je voulais avoir votre avis.


 


D'avance merci.


Réponses

  • PyrohPyroh Membre

    [[self.textView textStorage] processEditing]

    ne ferait pas l'affaire ?


  • berfisberfis Membre
    juin 2015 modifié #3

    Non, j'ai plein d'erreurs sur un objet "BigMutableString" dont j'ignorais jusqu'à  l'existence... Merci tout de même pour la réponse.


     


    Par contre j'ai trouvé ça:



    NSMutableAttributedString *changed = [source.text mutableCopy];
    [changed addAttribute: NSLinkAttributeName value: destination.objectID.URIRepresentation range:[self.textView selectedRange]];
    [source setText:changed];

    La variable "text" de mon objet semble être de type immutable (le framework doit la transformer en copie mutable dans mon dos). J'agis donc sur la variable de l'objet et laisse le NSTextView refléter les changements. Comme ça le KVO fonctionne -- et en fait c'est bien dans ce sens que ça doit marcher selon le MVC: le contrôleur agit sur le modèle et la vue fait écho au changement. Je m'y étais pris à  l'envers (modifier la vue et espérer que le modèle suive)... C'est bien la preuve que le MVC est fonctionnel et non une simple attitude philosophique !


Connectez-vous ou Inscrivez-vous pour répondre.