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?
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
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
(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