मैं अपने ऐप में TableViewController के लिए सरल खोज कार्यक्षमता जोड़ने की कोशिश कर रहा हूं। मैंने रे वेंडरलिच के ट्यूटोरियल का अनुसरण किया। मेरे पास कुछ डेटा के साथ एक तालिका दृश्य है, मैंने स्टोरीबोर्ड में खोज बार + प्रदर्शन नियंत्रक जोड़ा है, और फिर मेरे पास यह कोड है:
#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 में कोशिकाओं के लिए हैंडलिंग और डीक्यूइंग सिस्टम बदल गया है, और यह भी कि खोज एक अलग तालिका दृश्य का उपयोग करती है, इसलिए मुझे लगा कि समस्या यह थी कि फ़िल्टर किए गए परिणामों वाले खोज तालिका दृश्य सेल के बारे में नहीं जानते थे, इसलिए मैंने लगा दिया यह मेरे विचार में है
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
और वोइला! यह काम किया ... केवल पहली बार जब आप खोज करते हैं। यदि आप मूल परिणामों पर वापस जाते हैं और फिर से खोज करते हैं, तो ऐप उसी त्रुटि के साथ क्रैश हो जाता है। मैंने सोचा कि शायद सभी को जोड़ दिया जाए
if(!cell){//init cell here};
सेलफ़ोररॉ विधि के लिए सामान, लेकिन यह dequeueReusableCellWithIdentifier: forIndexPath: विधि होने के पूरे उद्देश्य के खिलाफ नहीं जाता है? वैसे भी, मैं हार गया हूं। मैं क्या खो रहा हूँ? कृपया मदद करें। आपके सभी समय के लिए अग्रिम धन्यवाद (:
एलेक्स।