Cómo evitar que se sobrescriban NSSearchField cadenas introducidas usando la primera entrada de la lista de autocompletar?

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

Pregunta

Estoy buscando una manera de crear un nssearchfield que se comporta de la siguiente manera:

  • usuario escribe en el texto
  • sobre la base de coincidencias aparece un desplegable de autocompletar
  • el texto en el campo de búsqueda hace no autocompletar al primer elemento de la lista

El punto es, mis búsquedas de cadenas coincidentes para cualquier subcadena y la terminación automática en el campo de texto no funcionaría porque sería sobrescribir mi cadena introducida. De hecho parece que este debe ser el comportamiento por defecto, o estoy mala interpretación del propósito de un campo de búsqueda?
Escribiendo más restringiría la lista más y más, pero sólo después de seleccionar un elemento en el menú desplegable de autocompletar se insertaría ese elemento en el campo de texto.

Si esto no se puede lograr usando un nssearchfield, ¿existe una alternativa?

¿Fue útil?

Solución

Mi propia solución era en realidad muy simple: sólo tiene que añadir el texto a buscar en sí a la lista de sugerencias para la terminación automática
. Esto se hace en el método NSSearchField control:textView:completions:forPartialWordRange:indexOfSelectedItem: delegado:

...
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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top