Я намагався додати просту функцію пошуку до TableViewController у своєму додатку. Я дотримувався підручника Рея Вендерліха. У мене є tableView з деякими даними, я додав рядок пошуку + контролер дисплея в розкадрування, і тоді у мене є такий код:
#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;
}
Стандартний матеріал, але коли я вводжу текст у рядок пошуку, він щоразу виходить з ладу з такою помилкою:
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'
Я розумію, що в iOS 6 змінилася система обробки та зняття черги з комірок, а також що пошук використовує інший tableView, тому я думав, що проблема полягала в тому, що пошук tableView із відфільтрованими результатами не знав про комірку, тому я поставив на мій поглядDidLoad:
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
І вуаля! Це спрацювало ... Тільки перший раз, коли ви шукаєте. Якщо ви повернетесь до початкових результатів і знову здійсните пошук, програма аварійно завершує роботу з тією ж помилкою. Я думав про те, можливо, додати все
if(!cell){//init cell here};
речі до методу cellForRow, але чи не суперечить це цілі призначення методу dequeueReusableCellWithIdentifier: forIndexPath:? У всякому разі, я загубився. Чого мені не вистачає? Допоможіть, будь ласка. Заздалегідь дякую за весь ваш час (:
Алекс.