How to prevent NSSearchField from overwriting entered strings using the first autocompletion list entry?

StackOverflow https://stackoverflow.com/questions/3981439

Question

I am looking for a way to create an nssearchfield that behaves as follows:

  • user types in text
  • based on matches an autocompletion drop-down appears
  • the text in the search field does not autocomplete to the first item in the list

The point is, my string matching searches for any substring and autocompletion in the text field would not work because it would overwrite my entered string. In fact it seems this should be the default behaviour, or am I misunderstanding the purpose of a search field?
Typing further would restrict the list further and further, but only after selecting an item in the autocompletion dropdown would that item be inserted into the text field.

If this cannot be accomplished using an nssearchfield, is there an alternative?

Was it helpful?

Solution

My own solution was actually very simple: just add the search string itself to the list of suggestions for the autocompletion.
This is done in the NSSearchField delegate method control: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;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top