내 앱의 TableViewController에 간단한 검색 기능을 추가하려고했습니다. Ray Wenderlich의 튜토리얼을 따랐습니다. 일부 데이터가있는 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가 셀에 대해 알지 못한다는 문제가 있다고 생각했기 때문에 이것은 내 viewDidLoad에서 :
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
그리고 짜잔! 효과가 ... 처음 검색했을 때만. 원래 결과로 돌아가 다시 검색하면 앱이 동일한 오류와 함께 충돌합니다. 나는 아마 모든 것을 추가하는 것에 대해 생각했다.
if(!cell){//init cell here};
물건을 cellForRow 메서드에 추가하지만 dequeueReusableCellWithIdentifier : forIndexPath : 메서드를 갖는 전체 목적에 위배되지 않습니까? 어쨌든 길을 잃었습니다. 내가 무엇을 놓치고 있습니까? 도와주세요. 시간 내 주셔서 미리 감사드립니다 (:
알렉스.