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];