2009-10-10 7 views
0

J'ai une chaîne attribuée liée à un NSTextView. J'utilise une méthode appelée (en utilisant KVO) chaque fois que la chaîne est éditée pour ajouter des attributs de couleur d'arrière-plan à une chaîne basée sur une correspondance de regEx. Je fais cela en créant une nouvelle chaîne attributée mutable avec -initWithAttributedString: puis -beginEditing, , -endEditing. Une fois que j'ai ajouté tous les attributs de couleur d'arrière-plan que je veux, j'appelle le setter de la chaîne [self setTextViewString:mutableAttributedString] Le problème est que s'il y a des attributs ajoutés à la chaîne, il tue undo et déplace le curseur à la fin de la chaîne.Maintenir Annuler dans modifié, lié, NSAttributedString

Comment maintenir une annulation? J'ai maintenu la position du curseur en appelant les méthodes selectedRanges et setSelectedRanges: de chaque côté du setter, mais cela semble encore un peu hackish.

Je n'étais pas capable de lier directement la textview à la chaîne mutableattributed, mais il semble qu'il devrait y avoir un moyen plus direct de modifier la chaîne liée afin qu'elle ne gâche pas l'édition. PS, l'ajout d'attributs se produit après la fin de la méthode KVO en appelant -performSelectorOnMainThread: C'était la seule façon d'afficher les attributs ajoutés.

Répondre

0

[self setTextView:mutableAttributedString]

Pardon? Vous définissez votre textView sur une chaîne attribuée? Cela n'aurait-il pas plus de sens d'y garder votre texte? Essayez d'obtenir le textStorage de l'affichage de texte et de remplacer son contenu par la nouvelle chaîne attribuée en envoyant un message setAttributedString: au stockage de texte.

+0

Désolé, ce n'était pas clair et je l'ai changé pour avoir plus de sens. J'ai mon textview lié à une chaîne attribuée donc j'appelle le setter * string's *, pas un setter pour le textview lui-même. –