2010-10-20 6 views
5

Sto cercando un modo per creare un nssearchfield che si comporta come segue:Come impedire a NSSearchField di sovrascrivere le stringhe immesse utilizzando la prima voce dell'elenco di completamento automatico?

  • utente digita testo
  • sulla base corrisponde appare un completamento automatico discesa
  • il testo nel campo di ricerca fa non completamento automatico alla prima voce dell'elenco

il punto è, la mia stringa corrispondente ricerche per qualsiasi sottostringa e il completamento automatico nel campo di testo non avrebbe funzionato perché sarebbe oVE rwrite la mia stringa inserita. In realtà sembra che questo dovrebbe essere il comportamento predefinito, o sto fraintendendo lo scopo di un campo di ricerca?
La digitazione ulteriore restringerebbe ulteriormente l'elenco, ma solo dopo aver selezionato un elemento nel menu a discesa completamento automatico l'elemento verrà inserito nel campo di testo.

Se questo non può essere realizzato utilizzando un nssearchfield, c'è un'alternativa?

risposta

3

La mia soluzione era in realtà molto semplice: basta aggiungere la stringa di ricerca stessa all'elenco dei suggerimenti per il completamento automatico.
Questo viene fatto nel metodo NSSearchField delegato 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; 
+0

Questo è abbastanza intelligente, mi piace. Se i suggerimenti hanno più parole, questo causa comunque un problema. Funziona benissimo per la prima parola, ma dopo verrà inserito il suggerimento completo dopo la prima parola. Mi chiedo se c'è un modo per aggirare questo. – Jeremy

+0

Ho risposto alla mia domanda. Vedere la mia risposta a http://stackoverflow.com/questions/5163646/how-to-make-nssearchfield-send-action-upon-autocompletion/5360535#5360535 per come evitare il completamento automatico dopo aver digitato lo spazio. – Jeremy

+0

@jeremy mi spiegherà di più sulla risposta, voglio ottenere lo stesso completamento automatico dopo aver digitato lo spazio? –

Problemi correlati