13

在我的tableview中有自定义单元格,我从UITableViewCell类初始化。我有第一个字母的记录部分,并有一个动态创建的indexPath。使用搜索显示控制器时自定义CellIdentifier为空

我想添加一个搜索显示控制器到我的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

编辑:问题实际上是解决了,我有用d UISearchBar而不是搜索显示控制器,但我想这个问题仍然没有解决。所以我愿意尝试任何方式使它工作。

回答

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

这可能已经解决了这个问题,但对于大多数人来说,问题在于如果不在该UITableView的队列中,它们不会创建新的单元格。下面的答案更适合解释如何处理这个问题。 – FilmJ 2012-08-16 06:25:15

+0

其实,从ios6开始,如果使用故事板,细胞就会一直存在.. – nikravi 2013-06-20 02:32:56

0

我不确定这应该如何在挡水板工作。

但通常你会检查[tableView dequeueReusableCellWithIdentifier:CellIdentifier]是否返回一个单元格。 因为如果在没有细胞之前加载或没有任何细胞重用你必须创建一个新的单元:在Objective-C中,我们10吨声明局部变量时

SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

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

也没有大写的第一封信。

+0

'SpeakerCell'没有可见的@interface声明选择器'initWithIdentifier:'? – kubilay 2012-04-17 10:28:18

+0

你把单元格设置为'nib'吗?然后,你将不得不加载'nib',你可以创建'initWithIdentifier'方法,并在这个方法中设置单元格。 – rckoenes 2012-04-17 11:15:29

+0

我不使用任何笔尖,我使用UITableViewCell类并在tableview中声明单元格标识符。 initWithIdentifier方法应包含哪些内容?回归自我?顺便说一句,为什么不在Objective-C中首字母大写?大多数例子都包含了,不知道它是错的。 – kubilay 2012-04-17 16:45:31

2

对于使用的iOS 5和故事的,你会想用下面的方法,而不是initWithIdentifier的:

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

例子:

NSString *cellIdentifier = @"ListItemCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 
0

我有同样的问题,用定制单元(建于故事板)不只要第一个字母被放置在搜索栏绘制。然而搜索很成功。

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

相关问题