了解dequeueReusableCellWithIdentifier

时间:2015-05-05 03:43:44

标签: ios objective-c uitableview

我对dequeueReusableCellWithIdentifier方法的使用及其工作方式感到困惑。我目前有一个searchBar和两个可变数组(比如filteredTableDatatableData)。现在我才意识到无论我做什么cell总是返回零。我的UITableView上也有一个过滤器功能(使用不同的数组),但它似乎总是返回一个零。我的问题是dequeueReusableCellWithIdentifier何时返回某些内容?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"SimpleTableItem";   
MMTableCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {

        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MMTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
        cell.RowNo = indexPath.row;
        cell.ImageAlbum.image = [self getMP3Pic:indexPath.row];
        cell.table = self.tableViewObject;
    }



NSString* sng =  isFiltered ?  [self.filteredTableData objectAtIndex:indexPath.row] : [self.tableData objectAtIndex:indexPath.row] ;

 cell.labelSongName.text = [NSString stringWithFormat:@"%@", sng ];
 return cell;

}

2 个答案:

答案 0 :(得分:3)

这实际上是显示 UITableView 的优化。想象一下,您要显示1,000个数据,创建1,000 UITableViewCell 以托管您的每个数据没有任何意义。因此,我们使用称为可重用性的东西,只使用一定数量的细胞。滚动时,它实际上不会释放不可见的单元格并创建新的单元格。它只是移动现有的细胞。

标识符仅用于根据您的需要识别不同的单元格。我可能在一个 UITableView 中使用了多个单元格原型。

对于您的问题,您需要在界面构建器中设置原型单元格。以编程方式,如果我们使用dequeueReusableCellWithIdentifier方法找不到单元格,那么我们创建。但是,您可以利用 Interface Builder ,它将始终返回单元格。

答案 1 :(得分:2)

dequeueReusableCellWithIdentifier 只是在适用时重用Cell。最初细胞总是零。因此,我们检查cell == nil条件,我们将首次创建UITableViewCell。当你滚动tableview时,将调用dequeueReusableCellWithIdentifier来重用已经在First Time创建的单元格。

您可以修改以下代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"SimpleTableItem";   
MMTableCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

 if (cell == nil) {
cell = [[MMTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier] ;
 }
cell.RowNo = indexPath.row;
cell.ImageAlbum.image = [self getMP3Pic:indexPath.row];
cell.table = self.tableViewObject;

NSString* sng =  isFiltered ?  [self.filteredTableData objectAtIndex:indexPath.row] : [self.tableData objectAtIndex:indexPath.row] ;

 cell.labelSongName.text = [NSString stringWithFormat:@"%@", sng ];
 return cell;
}

试试吧..希望它可以帮助你......!