如何在故事板中使用search结果控制器使用原型单元格

我有search结果控制器时,在search栏search得到这个错误表明,没有细胞,并得到以下错误。如何可以在此方法中创build我的prototype单元格CellForRowAtIndexPath

代码:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"HoCell"; Ho *cell; Ho *item; if (tableView == self.searchDisplayController.searchResultsTableView) { if (cell == nil) { cell = [[Ho alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"HoCell"]; } item = [searchResultsController objectAtIndexPath:indexPath]; } else{ cell = (Ho*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; item = [fetchedResultsController objectAtIndexPath:indexPath]; } cell.ho.text = item.name; cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"se.png"]]; return cell; } 

错误:

 *** Assertion failure in -[UISearchResultsTableView _configureCellForDisplay:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:5471 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

可能有两种可能性在这里:

1)你从tableView:numberOfRowsInSection:返回一个比你的Array Count大的数字。 别。

2)一个或多个cell#sockets没有连接到你的笔尖,或者没有连接到UITableViewCell(或子类)。 把它们连起来。

阅读Ray Wenderlich的链接: 如何将search添加到表格视图中

检查这个问题:

1) UITableView dataSource必须从tableView:cellForRowAtIndexPath:Exception返回一个单元格

2) iOS 5 UISearchDisplayController崩溃

更多美丽的链接: 自定义原型表格单元格和故事板只要看看这个部分:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:UYLCountryCellIdentifier]; if (cell == nil) { [self.countryCellNib instantiateWithOwner:self options:nil]; cell = self.countryCell; self.countryCell = nil; } // Code omitted to configure the cell... return cell; } 

你的代码似乎是越野车。 您检查单元格== nil,而它最初没有设置为零。 这也看起来有点奇怪,你以这种方式分配你的单元格基于search模式。

无论如何,我会做不同的方式。 Imho的方式,我几乎canonical :)只是使用您的search结果填充您的单元格与正确的数据为每个案件(search模式和正常模式)。 在这个例子中,searchResult和dataSource是带有string的数组。 我认为在现实生活中,它会比nsdictionary数组更复杂。

在你的视图控制器中:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)_section { /* Use correct data array so that in search mode we draw cells correctly. */ NSMutableArray *data = searching ? searchResult : dataSource; return [data count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { /* Use correct data array so that in search mode we draw cells correctly. */ NSMutableArray *data = searching ? searchResult : dataSource; static NSString *CellIdentifier = @"CellId"; CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[CustomTableViewCell alloc] initWithIdentifier:CellIdentifier] autorelease]; } /* Note this is only correct for the case that you have one section */ NSString *text = [data objectAtIndex:[indexPath row]] cell.textLabel.text = text; /* More setup for the cell. */ return text; } 

这里是search控制器和一些助手的委托方法:

 - (void) searchTableView { NSString *searchText = searchBar.text; for (NSString *item in dataSource) { NSRange range = [item rangeOfString:searchText options:NSCaseInsensitiveSearch]; if (range.length > 0) { [searchResult addObject:item]; } } } - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { searching = NO; } - (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller { searching = NO; [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic]; [searchResult removeAllObjects]; } - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchText { [searchResult removeAllObjects]; if ([searchText length] > 0) { searching = YES; [self searchTableView]; } else { searching = NO; } return YES; } 

希望这可以帮助。

我有同样的问题,这是做了什么,现在是完美的工作..

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Here is my code BEFORE // OPUsersTableViewCell *tableCell = [tableView dequeueReusableCellWithIdentifier:TableCellID]; // Here is my code AFTER // OPUsersTableViewCell *tableCell = [self.groupTableView dequeueReusableCellWithIdentifier:TableCellID]; 

注意:

self.groupTableViewprototype cell位置…