2012-11-29 29 views
8

Qualcuno sa di una classe o di una libreria che può implementare il completamento automatico in un NSTextField?Completamento automatico NSTextField

Sto cercando di ottenere il funzionamento standard dell'autocampione ma è stato creato come api sincrone. Ottengo le mie parole di autocompletamento tramite una chiamata API su Internet.

Che cosa ho fatto finora è:

- (void)controlTextDidChange:(NSNotification *)obj 
{ 
    if([obj object] == self.searchField) 
    { 
     [self.spinner startAnimation:nil]; 
     [self.wordcompletionStore completeString:self.searchField.stringValue]; 

     if(self.doingAutocomplete) 
      return; 
     else 
     { 
      self.doingAutocomplete = YES; 
      [[[obj userInfo] objectForKey:@"NSFieldEditor"] complete:nil]; 
     } 
    } 
} 

Quando il mio negozio è fatto, ho un delegato che viene chiamato:

- (void) completionStore:(WordcompletionStore *)store didFinishWithWords:(NSArray *)arrayOfWords 
{ 
    [self.spinner stopAnimation:nil]; 
    self.completions = arrayOfWords; 
    self.doingAutocomplete = NO; 
} 

Il codice che restituisce l'elenco di completamento al nstextfield è:

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index 
{ 
    *index = -1; 
    return self.completions; 
} 

Il mio problema è che questa sarà sempre una richiesta dietro e l'elenco di completamento o mostra nettamente ogni 2 carati che l'utente immette.

Ho provato a cercare Google e così come un pazzo, ma i cant sembrano trovare alcuna soluzione ..

Ogni aiuto è molto apprezzato.

risposta

9

Anziché avere la proprietà booleana di completamento automatico, rendere la proprietà il controllo che ha effettuato la richiesta. Chiamiamolo autoCompleteRequestor:

@property (strong) NSControl* autoCompleteRequestor; 

Allora, dove si imposta la proprietà attuale doingAutocomplete su YES, invece memorizzare un riferimento al vostro controllo.

- (void)controlTextDidChange:(NSNotification *)obj 
{ 
    if([obj object] == self.searchField) 
    { 
     [self.spinner startAnimation:nil]; 
     [self.wordcompletionStore completeString:self.searchField.stringValue]; 

     if(self.autoCompleteRequestor) 
      return; 
     else 
     { 
      self.autoCompleteRequestor = [[obj userInfo] objectForKey:@"NSFieldEditor"]; 
     } 
    } 
} 

Ora, quando la richiesta web è fatto, è possibile chiamare completo: il vostro oggetto memorizzato.

- (void) completionStore:(WordcompletionStore *)store didFinishWithWords:(NSArray *)arrayOfWords 
{ 
    [self.spinner stopAnimation:nil]; 
    self.completions = arrayOfWords; 
    if (self.autoCompleteRequestor) 
    { 
     [self.autoCompleteRequestor complete:nil]; 
     self.autoCompleteRequestor = nil; 
    } 
} 
+0

Testerò la tua soluzione quando tornerò al mio codice. –

+1

Ha funzionato perfettamente. Ho appena cambiato l'if-statematement per verificare self.autoCompleteRequestor invece di self.doingAutocomplete. Questa var booleana non è più necessaria. Grazie ancora! –

-1

NSTextView ha la funzionalità di completare parole di parole parziali.

Dai un'occhiata allo documentation per questo componente. Forse puoi passare a questo componente nella tua applicazione.

+0

Bene. Il problema è che le implementazioni predefinite prevedono di ottenere i risultati in modo sincrono mentre ottengo i suggerimenti pochi secondi dopo che l'utente ha digitato una parola. –

Problemi correlati