5 votes

NSTextFinder définit la chaîne de recherche et affiche un feedback visuel de manière programmatique

J'ai un NSTextView qui utilise la barre de recherche ( [textView setUsesFindBar:YES]; ).

J'ai deux questions.

  1. Comment effacer le retour visuel d'une opération de recherche ?

    Mon problème survient lorsque je modifie par programme le contenu du textView. Le retour visuel pour une opération de recherche sur le contenu précédent reste après le changement de contenu. Il est évident que ces boîtes jaunes ne s'appliquent pas au nouveau contenu et j'ai donc besoin d'un moyen de les effacer lorsque je modifie le contenu de la fenêtre de texte.

    Note : Je n'ai pas implémenté le protocole NSTextFinderClient parce que j'ai un simple textView et que la barre de recherche fonctionne sans aucun autre effort.

  2. Comment envoyer une chaîne de recherche à la barre de recherche ?

14voto

regulus6633 Points 11446

J'ai trouvé mes réponses, alors pour les autres, voici comment faire.

Tout d'abord, vous avez besoin d'une instance de NSTextFinder afin de pouvoir le contrôler. C'est ce que nous allons faire dans le code.

textFinder = [[NSTextFinder alloc] init];
[textFinder setClient:textView];
[textFinder setFindBarContainer:[textView enclosingScrollView]];
[textView setUsesFindBar:YES];
[textView setIncrementalSearchingEnabled:YES];

Première réponse : Pour obtenir un retour d'information visuel clair, je peux faire l'une des deux choses suivantes. Je peux simplement annuler le retour visuel...

[textFinder cancelFindIndicator];

Ou je peux avertir NSTextFinder que je suis sur le point de modifier le contenu de mon textView...

[textFinder noteClientStringWillChange];

Deuxième réponse : Il existe un NSFindPboard global. Vous pouvez l'utiliser pour définir une recherche.

// change the NSFindPboard NSPasteboardTypeString
NSPasteboard* pBoard = [NSPasteboard pasteboardWithName:NSFindPboard];
[pBoard declareTypes:[NSArray arrayWithObjects:NSPasteboardTypeString, NSPasteboardTypeTextFinderOptions, nil] owner:nil];
[pBoard setString:@"new search" forType:NSStringPboardType];
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSTextFinderCaseInsensitiveKey, [NSNumber numberWithInteger:NSTextFinderMatchingTypeContains], NSTextFinderMatchingTypeKey, nil];
[pBoard setPropertyList:options forType:NSPasteboardTypeTextFinderOptions];

// put the new search string in the find bar
[textFinder cancelFindIndicator];
[textFinder performAction:NSTextFinderActionSetSearchString];
[textFinder performAction:NSTextFinderActionShowFindInterface]; // make sure the find bar is showing

Mais il y a un problème. Le champ de texte dans la barre de recherche n'est pas mis à jour après ce code. J'ai découvert que si je bascule le premier répondeur, je peux le mettre à jour...

[myWindow makeFirstResponder:outlineView];
[myWindow makeFirstResponder:textView];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X