Je suis en train de travailler sur un Cacao éditeur de texte qui utilise un NSTextView. Est-il possible de changer la couleur de certaines parties du texte?
Vous devez ajouter votre contrôleur en tant que délégué de la NSTextStorage objet de la NSTextView ([textView textStorage]) puis de mettre en œuvre la méthode du délégué ‑textStorageDidProcessEditing:. Ceci est appelé chaque fois que la modification du texte.
Dans la méthode du délégué vous avez besoin pour obtenir le courant NSTextStorage objet à partir de l'affichage de texte à l'aide de la -textStorage méthode de NSTextView. NSTextStorage est une sous-classe de NSAttributedString et contient attribué le contenu de la vue.
Votre code doit ensuite analyser la chaîne et d'appliquer la coloration à ce que les plages de texte sont intéressants pour vous. Vous appliquez de la couleur à une plage à l'aide de quelque chose de ce genre, qui permet d'appliquer une couleur jaune à l'ensemble de la chaîne:
//get the range of the entire run of textNSRange area =NSMakeRange(0,[textStorage length]);//remove existing coloring[textStorage removeAttribute:NSForegroundColorAttributeName range:area];//add new coloring[textStorage addAttribute:NSForegroundColorAttributeName
value:[NSColor yellowColor]
range:area];
Comment vous analysez le texte est à vous. NSScanner est utile de classe à utiliser lors de l'analyse de texte.
Noter que cette méthode n est pas la façon la plus efficace de la manipulation de la coloration de la syntaxe. Si les documents que vous modifiez sont de très grande taille, vous voudrez sans doute envisager de déchargement de l'analyse d'un thread séparé et/ou faire le malin sur les sections de texte sont réanalysé.
C'est un peu vieux, mais comment pourrais-je mettre en œuvre -textStorageDidProcessEditing: dans le délégué? Comme toute autre méthode du délégué. Regardez en haut de la la signature de la méthode dans les docs et le placer dans votre délégué de l'objet de la mise en œuvre. Assurez-vous que votre délégué objet est définie comme le délégué de la NSTextStorage. Merci, +1. Votre méthode fonctionne beaucoup mieux que ma tentative Je pense que le responsable de traitement doit être la NSTextStorage délégué du, pas la NSTextView son délégué. Est ce que le droit? C'est mon expérience et ce que le commentaire suggère, mais il contredit et rend confus les deux premiers paragraphes de la réponse. Oui, vous avez raison. J'ai corrigé la réponse, merci!
Rob Keniger réponse est bon, mais pour quelqu'un qui cherche un exemple plus concret, voici un court syntaxe surligneur j'ai écrit et qui doit mettre en évidence les RegEx syntaxe du modèle. Je veux \ à être de couleur grise, avec le caractère qui suit immédiatement leur être noir. Je veux $ est rouge, avec un chiffre immédiatement à la suite de la $ également être rouge. Tout le reste doit être noir. Voici ma solution:
J'ai fait un modèle de marqueur de classe, avec un en-tête qui ressemble à ceci:
Je l'initialiser dans le fichier nib comme un objet et de le raccorder à mon point de vue contrôleur avec une prise de courant. Dans awakeFromNib de la vue-contrôleur, j'ai ceci (où replacer est mon NSTextView prise et templateHighlighter est la sortie pour la classe ci-dessus):
-(void)textStorageDidProcessEditing:(NSNotification*)notification {NSTextStorage*textStorage = notification.object;NSString*string = textStorage.string;NSUInteger n = string.length;[textStorage removeAttribute:NSForegroundColorAttributeName range:NSMakeRange(0, n)];for(NSUInteger i =0; i < n; i++){
unichar c =[string characterAtIndex:i];if(c =='\\'){[textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor lightGrayColor] range:NSMakeRange(i,1)];
i++;}elseif(c =='$'){NSUInteger l =((i < n -1)&& isdigit([string characterAtIndex:i+1]))?2:1;[textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:NSMakeRange(i, l)];
i++;}}}
Donc là vous allez, un exemple de travail. Il y avait quelques détails qui m'avait fauché pour ~10 minutes, comme le fait que vous avez à prendre la chaîne de textStorage pour accéder aux caractères individuels... peut-être que ce sauver d'autres personnes quelques minutes.
Merci, fonctionne comme prévu, et m'a sauvé pas mal de temps. Cela fonctionne très bien pour de la syntaxe, mais dans mon cas semble également pause le contentSize de mon UITextView. Plus précisément, le contentSize semble toujours être à la largeur de la UITextView x la hauteur d'une ligne. C'est un OS X solution... vous êtes de mentionner UITextView (pas de NSTextView) donc je suppose que vous travaillez avec iOS. Il peut y avoir de petites différences entre les Api... ce qui est le meilleur sur OS X ne peut pas être mieux sur iOS. vous avez raison, mon mauvais! Je devrais apprendre à lire les titres. Pour ce qu'il vaut, j'ai résolu mon problème avec le UITextView par la mise en allowsNonContiguousLayout = NO; sur le layout manager.
Je vous recommande de commencer par la lecture de la CocoaDev page sur la Syntaxe Highlighing. Beaucoup de gens sont venus avec des solutions pour différents objectifs.
Lol, jamais téléchargé de façon à ce que de nombreux échantillons de 1 site unique, génial! les cités de l'outil est maintenant sur github: UKSyntaxColoredTextDocument
Sûr. Vous pouvez donner le NSTextView un NSAttributedString, et certaines des choses que vous pouvez faire avec l'attribuée chaîne est d'appliquer des couleurs à certains sous-plages de la chaîne.
Ou vous pouvez recherche sur Google et de voir que beaucoup de gens ont fait des choses avec cette avant.
Je serais probablement vous recommandons d'utiliser OkudaKit.
Vous devez ajouter votre contrôleur en tant que délégué de la
NSTextStorage
objet de laNSTextView
([textView textStorage]
) puis de mettre en œuvre la méthode du délégué‑textStorageDidProcessEditing:
. Ceci est appelé chaque fois que la modification du texte.Dans la méthode du délégué vous avez besoin pour obtenir le courant
NSTextStorage
objet à partir de l'affichage de texte à l'aide de la-textStorage
méthode deNSTextView
.NSTextStorage
est une sous-classe deNSAttributedString
et contient attribué le contenu de la vue.Votre code doit ensuite analyser la chaîne et d'appliquer la coloration à ce que les plages de texte sont intéressants pour vous. Vous appliquez de la couleur à une plage à l'aide de quelque chose de ce genre, qui permet d'appliquer une couleur jaune à l'ensemble de la chaîne:
Comment vous analysez le texte est à vous.
NSScanner
est utile de classe à utiliser lors de l'analyse de texte.Noter que cette méthode n est pas la façon la plus efficace de la manipulation de la coloration de la syntaxe. Si les documents que vous modifiez sont de très grande taille, vous voudrez sans doute envisager de déchargement de l'analyse d'un thread séparé et/ou faire le malin sur les sections de texte sont réanalysé.
-textStorageDidProcessEditing:
dans le délégué?Comme toute autre méthode du délégué. Regardez en haut de la la signature de la méthode dans les docs et le placer dans votre délégué de l'objet de la mise en œuvre. Assurez-vous que votre délégué objet est définie comme le délégué de la
NSTextStorage
.Merci, +1. Votre méthode fonctionne beaucoup mieux que ma tentative
Je pense que le responsable de traitement doit être la NSTextStorage délégué du, pas la NSTextView son délégué. Est ce que le droit? C'est mon expérience et ce que le commentaire suggère, mais il contredit et rend confus les deux premiers paragraphes de la réponse.
Oui, vous avez raison. J'ai corrigé la réponse, merci!
OriginalL'auteur Rob Keniger
Rob Keniger réponse est bon, mais pour quelqu'un qui cherche un exemple plus concret, voici un court syntaxe surligneur j'ai écrit et qui doit mettre en évidence les RegEx syntaxe du modèle. Je veux
\
à être de couleur grise, avec le caractère qui suit immédiatement leur être noir. Je veux$
est rouge, avec un chiffre immédiatement à la suite de la$
également être rouge. Tout le reste doit être noir. Voici ma solution:J'ai fait un modèle de marqueur de classe, avec un en-tête qui ressemble à ceci:
Je l'initialiser dans le fichier nib comme un objet et de le raccorder à mon point de vue contrôleur avec une prise de courant. Dans
awakeFromNib
de la vue-contrôleur, j'ai ceci (oùreplacer
est monNSTextView
prise ettemplateHighlighter
est la sortie pour la classe ci-dessus):Et ma mise en œuvre ressemble à ceci:
Donc là vous allez, un exemple de travail. Il y avait quelques détails qui m'avait fauché pour ~10 minutes, comme le fait que vous avez à prendre la chaîne de textStorage pour accéder aux caractères individuels... peut-être que ce sauver d'autres personnes quelques minutes.
Cela fonctionne très bien pour de la syntaxe, mais dans mon cas semble également pause le
contentSize
de mon UITextView. Plus précisément, lecontentSize
semble toujours être à la largeur de la UITextView x la hauteur d'une ligne.C'est un OS X solution... vous êtes de mentionner
UITextView
(pas de NSTextView
) donc je suppose que vous travaillez avec iOS. Il peut y avoir de petites différences entre les Api... ce qui est le meilleur sur OS X ne peut pas être mieux sur iOS.vous avez raison, mon mauvais! Je devrais apprendre à lire les titres. Pour ce qu'il vaut, j'ai résolu mon problème avec le UITextView par la mise en
allowsNonContiguousLayout = NO;
sur le layout manager.OriginalL'auteur ArtOfWarfare
Je vous recommande de commencer par la lecture de la CocoaDev page sur la Syntaxe Highlighing. Beaucoup de gens sont venus avec des solutions pour différents objectifs.
Si vous souhaitez effectuer le code source de la syntaxe, je vous suggère de jeter un oeil à la UKSyntaxColoredTextDocument de Uli Kusterer.
les cités de l'outil est maintenant sur github: UKSyntaxColoredTextDocument
OriginalL'auteur Laurent Etiemble
Sûr. Vous pouvez donner le
NSTextView
unNSAttributedString
, et certaines des choses que vous pouvez faire avec l'attribuée chaîne est d'appliquer des couleurs à certains sous-plages de la chaîne.Ou vous pouvez recherche sur Google et de voir que beaucoup de gens ont fait des choses avec cette avant.
Je serais probablement vous recommandons d'utiliser OkudaKit.
OriginalL'auteur Dave DeLong