Ich habe versucht, einem TableViewController in meiner App einfache Suchfunktionen hinzuzufügen. Ich folgte Ray Wenderlichs Tutorial. Ich habe eine Tabellenansicht mit einigen Daten, ich habe die Suchleiste + den Display-Controller im Storyboard hinzugefügt und dann habe ich diesen 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;
}
Das Standardmaterial, aber wenn ich Text in die Suchleiste eingebe, stürzt es jedes Mal mit diesem Fehler ab:
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'
Ich verstehe, dass sich in iOS 6 das Handhabungs- und Warteschlangensystem für Zellen geändert hat und dass bei der Suche eine andere Tabellenansicht verwendet wird. Daher dachte ich, dass das Problem darin bestand, dass die Suchtabellenansicht mit den gefilterten Ergebnissen nichts über die Zelle wusste dies in meiner viewDidLoad:
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
Und voila! Es hat funktioniert ... Nur beim ersten Suchen. Wenn Sie zu den ursprünglichen Ergebnissen zurückkehren und erneut suchen, stürzt die App mit demselben Fehler ab. Ich dachte darüber nach, vielleicht alles hinzuzufügen
if(!cell){//init cell here};
Zeug zur cellForRow-Methode, aber widerspricht das nicht dem ganzen Zweck, die dequeueReusableCellWithIdentifier: forIndexPath: -Methode zu haben? Wie auch immer, ich bin verloren. Was vermisse ich? Hilfe bitte. Vielen Dank im Voraus für all Ihre Zeit (:
Alex.