2010-10-20 18 views
5

Je cherche un moyen de créer un nssearchfield qui se comporte comme suit:Comment empêcher NSSearchField d'écraser les chaînes entrées en utilisant la première entrée de la liste d'auto-complétion?

  • types d'utilisateurs dans le texte
  • sur la base correspond à une liste déroulante autocomplétion apparaît
  • le texte dans le champ de recherche ne pas autocomplete au premier élément de la liste

le point est, ma chaîne recherche correspondant à une sous-chaîne et saisie semi-automatique dans le champ de texte ne fonctionnerait pas parce qu'il serait ove écrivez ma chaîne entrée. En fait, il semble que cela devrait être le comportement par défaut, ou est-ce que je ne comprends pas le but d'un champ de recherche?
Si vous tapiez plus loin, la liste serait de plus en plus restreinte, mais seulement après la sélection d'un élément dans la liste déroulante d'auto-complétion, cet élément serait inséré dans le champ de texte.

Si cela ne peut pas être accompli en utilisant un champ de recherche, existe-t-il une alternative?

Répondre

3

Ma propre solution était en fait très simple: il suffit d'ajouter la chaîne de recherche elle-même à la liste des suggestions pour l'auto-complétion.
Cela se fait dans la méthode déléguée NSSearchFieldcontrol:textView:completions:forPartialWordRange:indexOfSelectedItem::

... 
partialString = [[textView string] substringWithRange:charRange]; 
... 

matches  = [NSMutableArray array]; 

// find any match in our keyword array against what was typed - 
for (i=0; i< count; i++) 
{ 
string = [keywords objectAtIndex:i]; 
if ([string 
    rangeOfString:partialString 
    options: NSCaseInsensitiveSearch | NSForcedOrderingSearch 
    range:NSMakeRange (0, [string length])] 
    .location != NSNotFound) { 
    [matches addObject:string]; 
} 
} 
[matches sortUsingSelector:@selector(compare:)]; 

// Make sure we insert the already entered string, even if it does not 
// match with any of the retrieved keywords. This will enter this string 
// in the search field, as we intended, and it will not be overwritten 
// with any match. 
[matches insertObject:partialString atIndex: 0]; 

return matches; 
+0

C'est assez intelligent, je l'aime. Si les suggestions ont plusieurs mots, cela pose un problème. Cela fonctionne bien pour le premier mot, mais après cela, il insérera la suggestion complète après le premier mot. Je me demande s'il y a moyen de contourner cela. – Jeremy

+0

Répondu à ma propre question. Voir ma réponse à http://stackoverflow.com/questions/5163646/how-to-make-nssearchfield-send-action-upon-autocompletion/5360535#5360535 pour savoir comment éviter l'auto-complétion après avoir tapé de l'espace. – Jeremy

+0

@jeremy va vous s'il vous plaît m'expliquer plus sur votre réponse, je veux atteindre même autocompleting après avoir tapé l'espace? –