4

tableview在搜索栏中搜索时使用搜索结果控制器得到此错误指示没有单元格并得到以下错误。如何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:'
4

3 回答 3

4

这里可能有两种可能性:

1) 您从 tableView:numberOfRowsInSection: 返回一个大于数组计数的数字。不。

2) 您的一个或多个 cell# 插座未连接到您的笔尖,或者未连接到 UITableViewCell(或子类)。正确连接它们。

浏览这个Ray Wenderlich 的链接: 如何将搜索添加到表视图中

检查这个SO 问题:

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;
}
于 2013-01-07T08:12:37.690 回答
0

您的代码似乎有问题。您检查 cell == nil,而它最初未设置为 nil。您根据搜索模式以这种方式分配单元格也看起来有点奇怪。

无论如何,我会以不同的方式来做。恕我直言,我这样做的方式几乎是规范的 :) 只需使用您的搜索结果为您的单元格填充每种情况下的正确数据(搜索模式和正常模式)。在此示例中,searchResult 和 dataSource 是带有字符串的数组。我认为在现实生活中对你来说这将是更复杂的东西,比如 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;
}

以下是搜索控制器和一些助手的委托方法:

- (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;
}

希望这可以帮助。

于 2013-01-07T08:56:50.100 回答
0

我有同样的问题,这就是所做的,现在它工作得很好..

- (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.groupTableView是在哪里prototype cell...

于 2015-08-11T06:18:38.707 回答