13

在我的表格视图中有我从 UITableViewCell 类初始化的自定义单元格。我有记录首字母的部分,并且有一个动态创建的 indexPath。

我想在我的 tableview 中添加一个搜索显示控制器。所以我做到了,创建了所有过滤数据的方法。我确信我的函数运行良好,因为我正在将数组计数打印到屏幕以获取搜索结果。

我的问题是第一次加载视图时,数据在屏幕上。但是当我点击搜索输入并输入一个字母时,我得到了'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'错误。使用断点后,我发现我的自定义单元格在搜索后为零。数据存在,但单元格未初始化。

这是我用于自定义单元初始化的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ObjectCell";

    SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSDictionary *myObject = [[sections valueForKey:[[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];

    cell.label1.text = [myObject objectForKey:@"myValue"];
    return cell;
}

我相信我在 IB 中放置控件时犯了一个错误。所以我添加了对象的截图:

在此处输入图像描述

我的表格视图的连接检查器

我的表格视图的连接检查器

我的搜索显示控制器的连接检查器

在此处输入图像描述

编辑:问题实际上已解决,我使用了 UISearchBar 而不是搜索显示控制器,但我想这个问题仍未解决。所以我愿意尝试任何方法让它发挥作用。

4

4 回答 4

54

截至此处搜索显示控制器问题,您需要访问self.tableView而不是tableView

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CellId"];

    // do your thing

    return cell;
}
于 2012-08-06T18:24:41.043 回答
2

对于使用 iOS 5 和 StoryBoards 的用户,您可能希望使用以下方法而不是initWithIdentifier

initWithStyle:(UITableViewCellStyle)stylereuseIdentifier:(NSString *)reuseIdentifier

例子:

  NSString *cellIdentifier = @"ListItemCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
  }
于 2012-08-16T06:23:21.167 回答
0

我不确定这在商店登机中应该如何工作。

但通常你会检查是否[tableView dequeueReusableCellWithIdentifier:CellIdentifier]返回一个单元格。因为如果之前未加载单元格或没有任何单元格可重用,则必须创建一个新单元格:

SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
   cell = [[SpeakerCell alloc] initWithIdentifier: CellIdentifier];
}

此外,当在 Objective-C 中声明局部变量时,我们倾向于不将第一个字母大写。

于 2012-04-17T10:21:10.530 回答
0

我遇到了同样的问题,自定义单元格(内置在 Storyboard 中)不会在第一个字母被放入搜索字段后立即被绘制。然而搜索成功了。

最后我从 Brenna Blackwell 那里找到了一个很好的教程,建议在 UITableViewCell 的相应子类中手动配置单元格绘制,添加 UILabels 和其他项目。

于 2014-02-01T08:23:02.980 回答