J'ai essayé d'ajouter une fonctionnalité de Recherche pour un TableViewController dans mon application. J'ai suivi Ray Wenderlich du tutoriel. J'ai un tableView avec certaines données, j'ai ajouté à la barre de recherche + contrôleur d'affichage dans la table de montage séquentiel, et puis j'ai ce code:
#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;
}
La norme des choses, mais quand j'ai entrer le texte dans la barre de recherche, il plante à chaque fois avec cette erreur:
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'
Je comprends que dans iOS 6, la manipulation et dequeueing système pour les cellules changé, et aussi que la recherche utilise un autre tableView, j'ai donc pensé que le problème était que la recherche de la tableView avec les résultats filtrés ne savais pas à propos de la cellule, alors j'ai mis ça dans mon viewDidLoad:
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
Et le tour est joué! Il a travaillé... Seulement la première fois que vous recherchez. Si l'on remonte à l'origine des résultats et de la recherche, de nouveau, l'application se bloque avec la même erreur. J'ai pensé peut-être l'ajout de tous les
if(!cell){//init cell here};
des trucs à la cellForRow méthode, mais n'est-ce pas aller à l'encontre de l'objectif de la dequeueReusableCellWithIdentifier:forIndexPath: méthode? De toute façon, je suis perdu. Ce qui me manque? Aider, s'il vous plaît. Je vous remercie à l'avance pour tout votre temps (:
Alex.