NSTextView et NSSearchField

GramboGrambo Membre
03:25 modifié dans API AppKit #1
Bonjour,

D'après ce que j'ai compris le NSSearchField est tout à  fait adapté pour faire une recherche dans une NSTextView simplement.
Sans une seule ligne de code, la recherche d'un mot dans ma NSTextView depuis le menu Edit->Find->Find... fonctionne comme je le souhaite (surlignage animé jaune du mot trouvé). On utilise pour cela la fonction performFindPanelAction qui est envoyée au FirstResponder.
Peut-on gérer le recherche depuis le NSSearchField de la même façon, sans écrire une seule ligne de code? Si oui, que faut-il faire dans IB pour établir la liaison entre le NSSearchField et la NSTextView.
Sinon je suppose qu'il faut écrire une fonction. Dans ce cas comment faire pour surligner le mot sans écrire une usine à  gaz.

La réponse est sans doute simple, mais je ne maà®trise pas tout!

Merci d'avance.

Réponses

  • NoNo Membre
    03:25 modifié #2
    Malheureusement, les search-field sont réduits à  leur plus simple expression.
    Il te faut donc coder (un peu) pour simuler la recherche dans la textView via performFindPanelAction.

    Je te donne un petit exemple qui utilise la méthode action du search-field. Je ne l'ai pas testé donc à  voir si ça va marcher...
    <br />- (IBAction)searchfield:(id)sender<br />{<br />&nbsp;  // récupération de la chaine à  rechercher<br />&nbsp;  NSString *rech=[searchField stringValue];<br /><br />&nbsp;  // initialisation du presse-papier de recherche avec la chaine à  rechercher<br />&nbsp;  NSPasteboard *pb=[NSPasteboard pasteboardWithName:NSFindPboard];<br />&nbsp;  [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];<br />&nbsp;  [pb setString:rech forType:NSStringPboardType];<br /><br />&nbsp;  // le mode de recherche est &quot;sélectionner toutes les occurences recherchées&quot;<br />&nbsp;  [searchField setTag:NSFindPanelActionSelectAll];<br /><br />&nbsp;  // déclenchement de la recherche dans la NSTextView<br />&nbsp;  [textView performFindPanelAction:searchField];<br />}<br />
    

    Dans le code ci-dessus, l'outlet vers le search-field est searchField, et celui vers ta textView est textView .
  • GramboGrambo Membre
    03:25 modifié #3
    Bonjour,

    Je viens d'essayer le code dans mon programme et cela ne fonctionne toujours pas. Le programme bipe à  chaque fois que j'appuie sur entrée et que je suis sur le searchField.
    J'ai même essayé de remplacer searchField par sender et j'obtiens le même résultat.  J'ai également essayé avec d'autres tags, sans plus de succès.
    Je ne sais plus dans quelle direction chercher...
  • NoNo Membre
    03:25 modifié #4
    Bon, j'ai fait des tests, et mauvaise nouvelle, performFindPanelAction: ne fonctionne pas vraiment comme attendu.
    Il faut dire que la doc est plus que succincte.
    Pour que ça fonctionne bien (pilotage de la recherche), il faut que le find panel soit affiché.

    Donc il ne te reste plus qu'à  faire ton propre module de recherche.
    Une solution simple (mais je ne sais pas dans quel cadre tu fais ta recherche) :
    <br />{<br />&nbsp;  NSString *str=[[textview textStorage] string];<br />&nbsp;  if (str &amp;&amp; [str length]&gt;0)<br />&nbsp;  {<br />&nbsp; &nbsp; &nbsp; NSRange r=[str rangeOfString:[searchfield stringValue] options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];<br />&nbsp; &nbsp; &nbsp; if (r.location!=NSNotFound) [textview showFindIndicatorForRange:r];<br />&nbsp;  }<br />}<br />
    


    Le code utilise la méthode showFindIndicatorForRange: de NSTextView pour afficher temporairement un cartouche jaune autour de la première occurrence recherchée (et tapée dans le search-field).
  • GramboGrambo Membre
    03:25 modifié #5
    C'est exactement ce que je recherchais. Merci beaucoup. J'avais pourtant lu et relu la documentation de NSTextView, sans voir cette fonction.

    J'ai simplement rajouté la fonction scrollRangeToVisible: pour m'assurer que le texte à  mettre en évidence est bien affiché.


    <br />{<br />&nbsp;  NSString *str=[[textview textStorage] string];<br />&nbsp;  if (str &amp;&amp; [str length]&gt;0)<br />&nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; NSRange r=[str rangeOfString:[searchfield stringValue] options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];<br />&nbsp; &nbsp; &nbsp; if (r.location!=NSNotFound) <br />&nbsp; &nbsp; &nbsp; &nbsp;  {<br />&nbsp; &nbsp; &nbsp; &nbsp;  [textview scrollRangeToVisible:r];<br />&nbsp; &nbsp; &nbsp; &nbsp;  [textview showFindIndicatorForRange:r];<br />&nbsp; &nbsp; &nbsp; &nbsp;  }<br />&nbsp; &nbsp; &nbsp; }<br />}
    
Connectez-vous ou Inscrivez-vous pour répondre.