5

Ho aggiunto un UISearchDisplayController al mio UITableViewController in InterfaceBuilder. È stato molto facile farlo funzionare aggiungendo un metodo searchBar: searchBar textDidChange: searchText che rigenera l'array di dati per la tabella e chiama reloadData.Come precaricare o inizializzare una ricerca utilizzando UISearchDisplayController?

Ma mi piacerebbe avere la ricerca precedente mostra la prossima volta che gli utenti toccheranno nella barra di ricerca poiché è molto più facile toccare (X) e cancellarlo piuttosto che digitarlo di nuovo. Ma non riesco a farlo per farlo. Di seguito è riportato il codice che ho provato:

- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText { 
    if(searchText && [searchText length] > 0) { 
     self.displayedRows = [[NSMutableArray initWithCapacity: 1]; 
     for(NSString *l in self.allRows) { 
      NSRange r = [l rangeOfString: searchText]; 
      if(r.location != NSNotFound) 
       [self.displayedRows addObject: l]; 
     } 
     [self.searchDisplayController.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillBeginSearch: (UISearchDisplayController *) controller { 
    if(self.lastSearch && [self.lastSearch length] > 0) { 
     controller.searchBar.text = self.lastSearch; 
     [controller.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillEndSearch: (UISearchDisplayController *) controller { 
    self.lastSearch = controller.searchBar.text; 
    self.displayedRows = self.allRows; 
    [self.tableView reloadData]; 
} 

L'ultimo testo di ricerca è in modo appropriato nella barra di ricerca la prossima volta che tocco la ricerca e sono rimasto sorpreso che il 'puntatore' è anche posizionato alla fine, ma la i risultati della ricerca non sono mostrati, solo la vista buia dei contenuti originali come il campo di ricerca era vuota. Non appena digito un carattere, i risultati della ricerca vengono aggiornati.

Ho provato a mettere l'equivalente di [self.searchDisplayController.searchResultsTableView reloadData] in ciascuno dei:

searchDisplayControllerDidBeginSearch: (UISearchDisplayController *) controller 
searchDisplayController: (UISearchDisplayController *) controller didLoadSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller willShowSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller didShowSearchResultsTableView: (UITableView *) tableView 

Ma non faceva alcuna differenza ... solo vuoto fino a quando ho digitare qualcosa.

Qualcuno ha qualche idea su come ottenere un risultato di ricerca precaricato?

risposta

7

avete bisogno di qualcosa di simile:

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller { 
    if(lastSearch.length > 0) { 
     NSLog(@"In searchDisplayControllerDidBeginSearch"); 
     [self.searchDisplayController.searchBar setText:lastSearch]; 
    } 
} 

Se è necessario apportare ulteriori modifiche, suggerisco l'apertura dei UIKit intestazioni UISearchBar.h e UISearchDisplayController.h e guardando a quello che si può sovraccaricare e dove. Inoltre, NSLog è tuo amico =)

anche

Proprio per spiegare cosa sta succedendo e come questo è diverso da ...searchBar.text = lastSearch, setText forze textDidChange di registrarsi, che a sua volta rifà la ricerca, e successivamente ha una chiamata a shouldReloadTableForSearchString. Cambiare semplicemente il testo senza usare setText (per qualche motivo) non attiva textDidChange.

+0

Incredibile, pensavo di aver provato ogni possibile combinazione di tutti i diversi willBegins e didBegins ma stavo spostando solo la parte 'reloadData' poiché il test di ricerca precedente era sempre nel campo di ricerca. – LavaSlider

+0

Ho provato, come hai suggerito di spostare 'controller.searchBar.text = self.lastSearch' e presto, funziona (che un po 'di dark-flash che sarebbe bello non avere). Non mi sembra nemmeno di aver bisogno di 'reloadData'. Grazie. – LavaSlider

+0

(Oh, e ho avuto così tanti 'NSLogs'. Li ho avuti quando stavo entrando e lasciando i metodi e mostrando il contenuto del campo e le dimensioni degli array ... semplicemente non si aggiornava). – LavaSlider

Problemi correlati