Как запретить NSSearchField перезаписывать введенные строки, используя первую запись в списке автозаполнения? - PullRequest
5 голосов
/ 20 октября 2010

Я ищу способ создать поле nssearch, которое ведет себя следующим образом:

  • пользователь печатает в тексте
  • на основе совпадений появляется раскрывающийся список автозаполнения
  • текст в поле поиска делает не автозаполнение первого элемента в списке

Дело в том, что поиск совпадений по моей строке для любой подстроки и автозаполнение в текстовом поле не будет работать, потому что он перезапишет мою введенную строку. На самом деле кажется, что это должно быть поведение по умолчанию, или я неправильно понимаю цель поля поиска?
Дальнейший ввод будет ограничивать список дальше и дальше, но только после выбора элемента в раскрывающемся списке автозаполнения этот элемент будет вставлен в текстовое поле.

Если это невозможно сделать с помощью nssearchfield, есть ли альтернатива?

1 Ответ

4 голосов
/ 01 ноября 2010

Мое собственное решение было на самом деле очень простым: просто добавьте строку поиска в список предложений для автозаполнения.
Это делается в методе делегата NSSearchField 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;
...