Cómo evitar que se sobrescriban NSSearchField cadenas introducidas usando la primera entrada de la lista de autocompletar?
-
09-10-2019 - |
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 ??li>
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?
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;