使用搜索显示控制器时,自定义CellIdentifier为空

时间:2012-04-17 10:12:33

标签: iphone objective-c xcode uitableview uisearchdisplaycontroller

在我的tableview中有我从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时我犯了一个错误。所以我添加了对象的截图:

enter image description here

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

Connections inspector for my table view

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

enter image description here

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

4 个答案:

答案 0 :(得分:54)

截至此search display controller question, 您需要访问self.tableView而不是tableView

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

    // do your thing

    return cell;
}

答案 1 :(得分: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];
  }

答案 2 :(得分:0)

我不确定这应该如何在商店中使用。

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

SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

同样,当在Objective-C中声明局部变量时,我们不会将第一个字母大写。

答案 3 :(得分:0)

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

最后我发现good tutorial from Brenna Blackwell建议在UITableViewCell的相应子类中手动配置单元格绘图,添加UILabel和其他项目。