5

Agregué un UISearchDisplayController a mi UITableViewController en InterfaceBuilder. Fue muy fácil hacerlo funcionar agregando un método searchBar: searchBar textDidChange: searchText que regenera la matriz de datos para la tabla y llama al reloadData.¿Cómo precargar o inicializar una búsqueda usando UISearchDisplayController?

Pero me gustaría que la búsqueda anterior se muestre la próxima vez que los usuarios toquen la barra de búsqueda, ya que es mucho más fácil tocar la (X) y borrarla que escribirla de nuevo. Pero no puedo lograr que lo haga. A continuación se muestra el código que he intentado:

- (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]; 
} 

El último texto de búsqueda es apropiada en la barra de búsqueda la próxima vez que toco la búsqueda y me sorprendió que el 'cursor' incluso se coloca al final, pero el los resultados de búsqueda no se muestran, solo la vista oscurecida de los contenidos originales como el campo de búsqueda estaba vacía. Tan pronto como escribo un personaje, los resultados de la búsqueda se actualizan.

He intentado poner el equivalente de [self.searchDisplayController.searchResultsTableView reloadData] en cada uno de:

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

Pero no había ninguna diferencia ... solo en blanco hasta que escribo algo.

¿Alguien tiene alguna idea de cómo obtener un resultado de búsqueda precargado?

Respuesta

7

se necesita algo como esto:

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

Si necesita realizar más cambios, que sugieren la apertura de las cabeceras UIKitUISearchBar.h y UISearchDisplayController.h y mirando a lo que puede sobrecargar y dónde. Además, NSLog es su amigo =)

también

Sólo para explicar lo que está pasando y cómo esto es diferente de ...searchBar.text = lastSearch, setText fuerzas textDidChange se registren, que a su vez se rehace la búsqueda, y posteriormente se ha una llamada al shouldReloadTableForSearchString. Simplemente cambiar el texto sin usar setText (por alguna razón) no activa textDidChange.

+0

Sorprendente, pensé que había intentado todas las combinaciones posibles de todos los diferentes principios de inicio y comienzo, pero solo estaba moviendo la parte 'reloadData' ya que la prueba de búsqueda anterior siempre estaba en el campo de búsqueda. – LavaSlider

+0

Intenté, como sugirió mover el 'controller.searchBar.text = self.lastSearch' y presto, funciona (que es un poco oscuro-flash que sería bueno no tener). Ni siquiera parece necesitar el 'reloadData'. Gracias. – LavaSlider

+0

(Ah, y tenía tantos 'NSLogs'. Los tenía cuando estaba ingresando y dejando métodos y mostrando los contenidos de campo y los tamaños de arreglo ... simplemente no se actualizaba). – LavaSlider

Cuestiones relacionadas