Iphone 使用搜索显示控制器时,自定义CellIdentifier为空
在我的tableview中,有我从UITableViewCell类初始化的自定义单元格。我有记录首字母的部分,并且有一个动态创建的indexPath 我想在我的tableview中添加一个搜索显示控制器。所以我创建了所有的方法来过滤数据。我确信我的函数运行得很好,因为我正在将数组计数打印到屏幕上以获取搜索结果 我的问题是,第一次加载视图时,数据就出现在屏幕上。但是当我点击搜索输入并键入一个字母时,我得到了Iphone 使用搜索显示控制器时,自定义CellIdentifier为空,iphone,objective-c,xcode,uitableview,uisearchdisplaycontroller,Iphone,Objective C,Xcode,Uitableview,Uisearchdisplaycontroller,在我的tableview中,有我从UITableViewCell类初始化的自定义单元格。我有记录首字母的部分,并且有一个动态创建的indexPath 我想在我的tableview中添加一个搜索显示控制器。所以我创建了所有的方法来过滤数据。我确信我的函数运行得很好,因为我正在将数组计数打印到屏幕上以获取搜索结果 我的问题是,第一次加载视图时,数据就出现在屏幕上。但是当我点击搜索输入并键入一个字母时,我得到了'UITableView数据源必须从tableView:cellforrowatinexpa
'UITableView数据源必须从tableView:cellforrowatinexpath:'返回一个单元格。
错误。在使用断点后,我发现我的自定义单元格在搜索后为零。数据存在,但单元格未初始化
以下是我用于自定义单元格初始化的代码:
- (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而不是搜索显示控制器,但我想这个问题仍然没有解决。因此,我愿意尝试任何方法使其发挥作用。我不确定这在storeboarding中应该如何发挥作用 但通常您会检查
[tableView dequeueReusableCellWithIdentifier:CellIdentifier]
是否返回单元格。
因为如果之前未加载中的单元格或没有任何可重用的单元格,则必须创建一个新单元格:
SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[SpeakerCell alloc] initWithIdentifier: CellIdentifier];
}
此外,在Objective-C中声明局部变量时,我们不允许首字母大写 从这里开始,
您需要访问self.tableView
而不是tableView
:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CellId"];
// do your thing
return cell;
}
对于使用iOS 5和故事板的用户,您可能希望使用以下方法,而不是使用initWithIdentifier: initWithStyle:(UITableViewCellStyle)样式重用标识符:(NSString*)重用标识符 例如:
NSString *cellIdentifier = @"ListItemCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
我也有同样的问题,自定义单元格(内置故事板)没有在第一个字母放入搜索字段时立即绘制。然而,搜索是成功的
最后,我发现了一个建议,建议在UITableViewCell的相应子类中手动配置单元格绘图,添加UILabels和其他项。SpeakerCell的无可见@interface声明选择器“initWithIdentifier:”?是否将单元格设置为
nib
?然后,您必须加载nib
其他,您可以创建methodeinitWithIdentifier
并在此方法中设置单元格。我不使用任何nib,我使用的是UITableViewCell类并在tableview中声明单元格标识符。initWithIdentifier方法应该包含什么?回归自我?顺便问一下,为什么Objective-C中的首字母不大写?大多数例子都包含这样的内容,我不知道这是错误的。我确信当使用故事板时,单元格的加载方式应该是正确的。但是关于第一个字母的大写字母,这在Objective-c风格的指南中:这可能解决了问题,但对于大多数人来说,问题是如果UITableView的队列中还没有新单元格,他们就不会创建新单元格。下面的答案更恰当地解释了如何处理这个问题。