He intentado agregar una funcionalidad de búsqueda simple a un TableViewController en mi aplicación. Seguí el tutorial de Ray Wenderlich. Tengo un tableView con algunos datos, agregué la barra de búsqueda + el controlador de pantalla en el guión gráfico, y luego tengo este código:
#pragma mark - Table View
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BreedCell" forIndexPath:indexPath];
//Create PetBreed Object and return corresponding breed from corresponding array
PetBreed *petBreed = nil;
if(tableView == self.searchDisplayController.searchResultsTableView)
petBreed = [_filteredBreedsArray objectAtIndex:indexPath.row];
else
petBreed = [_breedsArray objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.text = petBreed.name;
return cell;
}
#pragma mark - Search
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[_filteredBreedsArray removeAllObjects];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",searchString];
_filteredBreedsArray = [[_breedsArray filteredArrayUsingPredicate:predicate] mutableCopy];
return YES;
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
// Tells the table data source to reload when scope bar selection changes
[_filteredBreedsArray removeAllObjects];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",self.searchDisplayController.searchBar.text];
_filteredBreedsArray = [[_breedsArray filteredArrayUsingPredicate:predicate] mutableCopy];
return YES;
}
Las cosas estándar, pero cuando ingreso texto en la barra de búsqueda, se bloquea cada vez con este error:
2013-01-07 19:47:07.330 FindFeedo[3206:c07] *** Assertion failure in -[UISearchResultsTableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460
2013-01-07 19:47:07.330 FindFeedo[3206:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier BreedCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
Entiendo que en iOS 6 el sistema de manejo y eliminación de la cola de las celdas cambió, y también que la búsqueda usa una vista de tabla diferente, así que pensé que el problema era que la vista de tabla de búsqueda con los resultados filtrados no conocía la celda, así que puse esto en mi opiniónDidLoad:
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
¡Y voilá! Funcionó ... Sólo la primera vez que buscas. Si vuelve a los resultados originales y vuelve a buscar, la aplicación se bloquea con el mismo error. Pensé en agregar todos los
if(!cell){//init cell here};
cosas al método cellForRow, pero ¿no va eso en contra del propósito de tener el método dequeueReusableCellWithIdentifier: forIndexPath:? De todos modos, estoy perdido. ¿Qué me estoy perdiendo? Ayuda por favor. Gracias de antemano por todo su tiempo (:
Alex.