Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用搜索显示控制器时,自定义CellIdentifier为空_Iphone_Objective C_Xcode_Uitableview_Uisearchdisplaycontroller - Fatal编程技术网

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

Iphone 使用搜索显示控制器时,自定义CellIdentifier为空,iphone,objective-c,xcode,uitableview,uisearchdisplaycontroller,Iphone,Objective C,Xcode,Uitableview,Uisearchdisplaycontroller,在我的tableview中,有我从UITableViewCell类初始化的自定义单元格。我有记录首字母的部分,并且有一个动态创建的indexPath 我想在我的tableview中添加一个搜索显示控制器。所以我创建了所有的方法来过滤数据。我确信我的函数运行得很好,因为我正在将数组计数打印到屏幕上以获取搜索结果 我的问题是,第一次加载视图时,数据就出现在屏幕上。但是当我点击搜索输入并键入一个字母时,我得到了'UITableView数据源必须从tableView:cellforrowatinexpa

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

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

我的问题是,第一次加载视图时,数据就出现在屏幕上。但是当我点击搜索输入并键入一个字母时,我得到了
'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
其他,您可以创建methode
initWithIdentifier
并在此方法中设置单元格。我不使用任何nib,我使用的是UITableViewCell类并在tableview中声明单元格标识符。initWithIdentifier方法应该包含什么?回归自我?顺便问一下,为什么Objective-C中的首字母不大写?大多数例子都包含这样的内容,我不知道这是错误的。我确信当使用故事板时,单元格的加载方式应该是正确的。但是关于第一个字母的大写字母,这在Objective-c风格的指南中:这可能解决了问题,但对于大多数人来说,问题是如果UITableView的队列中还没有新单元格,他们就不会创建新单元格。下面的答案更恰当地解释了如何处理这个问题。