Tôi đã cố gắng thêm chức năng Tìm kiếm đơn giản vào TableViewController trong ứng dụng của mình. Tôi đã làm theo hướng dẫn của Ray Wenderlich. Tôi có một tableView với một số dữ liệu, tôi đã thêm thanh tìm kiếm + bộ điều khiển hiển thị trong bảng phân cảnh và sau đó tôi có mã này:
#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;
}
Nội dung tiêu chuẩn, nhưng khi tôi nhập văn bản vào thanh tìm kiếm, nó bị treo mỗi lần với lỗi này:
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'
Tôi hiểu rằng trong iOS 6, hệ thống xử lý và xếp hàng cho các ô đã thay đổi và tìm kiếm cũng sử dụng một tableView khác, vì vậy tôi nghĩ vấn đề là tableView tìm kiếm với kết quả đã lọc không biết về ô, vì vậy tôi đặt cái này trong viewDidLoad của tôi:
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
Và Voila! Nó hoạt động ... Chỉ lần đầu tiên bạn tìm kiếm. Nếu bạn quay lại kết quả ban đầu và tìm kiếm lại, ứng dụng bị lỗi với cùng một lỗi. Tôi đã nghĩ về việc có thể thêm tất cả
if(!cell){//init cell here};
vào phương thức cellForRow, nhưng điều đó không đi ngược lại toàn bộ mục đích của việc có phương thức dequeueReusableCellWithIdentifier: forIndexPath: sao? Dù sao thì tôi cũng lạc lối. Tôi đang thiếu gì? Giúp tôi với. Cảm ơn bạn trước cho tất cả thời gian của bạn (:
Alex.