Iphone UITableViewCell-在重复使用时在数据顶部显示数据的视图

Iphone UITableViewCell-在重复使用时在数据顶部显示数据的视图,iphone,uitableview,Iphone,Uitableview,我正在使用自定义UITableViewCell。它们的加载效果很好,但是当它们被重用而不是替换标签中的文本时,它们就有点像是在它们上面写的。有没有办法阻止这种行为 我假设在重用视图之前没有正确重置视图。我当前正在清空标签,因此它们只有一个空@“”字符串。但我仍然得到旧的文本加上新的(非常混乱) 我确信有一个明显的解决方案(目前我只是不重用电池,但这不是最佳实践,在旧设备上速度较慢),因此如果有人能帮助我,我将非常感激 谢谢 根据要求,这里是修改单元格的方法 static NSString *C

我正在使用自定义UITableViewCell。它们的加载效果很好,但是当它们被重用而不是替换标签中的文本时,它们就有点像是在它们上面写的。有没有办法阻止这种行为

我假设在重用视图之前没有正确重置视图。我当前正在清空标签,因此它们只有一个空@“”字符串。但我仍然得到旧的文本加上新的(非常混乱)

我确信有一个明显的解决方案(目前我只是不重用电池,但这不是最佳实践,在旧设备上速度较慢),因此如果有人能帮助我,我将非常感激

谢谢

根据要求,这里是修改单元格的方法

static NSString *CellIdentifier = @"Cell";
TransactionCellView *cell = (TransactionCellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TransactionCellView" owner:self options:nil];
    cell = tblCell;
}

[cell resetCell]; // clears the labels
[cell setData:[dataArray objectAtIndex:[indexPath row]]; // replaces the data and updates the labels

return cell;

}

您是正确的,这些单元格正在被重复使用。应使用以下模式大致设置代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString* identifier = @"someidentifier";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if(!cell) {
        // create the cell and add all subviews to it
    } else {
        // update the cell and access appropriate subviews to modify what is displayed
    }
    return cell;
}
第一次使用标识符时将创建单元格。对于所有后续请求,将从
UITableView
缓存中提取单元格(通过
dequeueReusableCellWithIdentifier
),然后您可以通过标记、索引、类型或选择的任何机制访问其子视图


有些相关的是,您可以有多个单元格标识符,这允许您根据所拥有的数据创建不同单元格的多个实例。在我的一个项目中,我有4个不同的单元格,每个单元格取决于它们将显示的数据行数(1到4之间的任意位置)。无论单元格有多少行,这都有助于确保平滑的滚动体验,因为渲染器不必担心动态更改单元格的高度。

重复使用单元格是正确的。应使用以下模式大致设置代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString* identifier = @"someidentifier";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if(!cell) {
        // create the cell and add all subviews to it
    } else {
        // update the cell and access appropriate subviews to modify what is displayed
    }
    return cell;
}
第一次使用标识符时将创建单元格。对于所有后续请求,将从
UITableView
缓存中提取单元格(通过
dequeueReusableCellWithIdentifier
),然后您可以通过标记、索引、类型或选择的任何机制访问其子视图


有些相关的是,您可以有多个单元格标识符,这允许您根据所拥有的数据创建不同单元格的多个实例。在我的一个项目中,我有4个不同的单元格,每个单元格取决于它们将显示的数据行数(1到4之间的任意位置)。无论单元格有多少行,这都有助于确保平滑的滚动体验,因为渲染器不必担心动态更改单元格的高度。

我怀疑您是在CellForRowatineXpath方法中以编程方式将标签添加为子视图。您需要确保不是每次回收单元时都添加该子视图。相反,仅在创建新单元格时创建标签(而不是在回收单元格时),然后为标签指定标记值,然后在将来回收标签时,按标记值检索标签并更改其文本

我怀疑您是在cellForRowAtIndexPath方法中以编程方式将标签添加为子视图。您需要确保不是每次回收单元时都添加该子视图。相反,仅在创建新单元格时创建标签(而不是在回收单元格时),然后为标签指定标记值,然后在将来回收标签时,按标记值检索标签并更改其文本

试试这个

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

        for (UIView* subView in cell.contentView.subviews)
        {       
            [subView removeFromSuperview];
        }   
       // Your Code to customize cell goes here.
 }
试试这个

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

        for (UIView* subView in cell.contentView.subviews)
        {       
            [subView removeFromSuperview];
        }   
       // Your Code to customize cell goes here.
 }

解决了这个问题!!!当你知道问题是什么/曾经是什么的时候,这就非常简单了

我使用的是IB,在我的UILabel上没有选择“Clear Graphics Context”。这就是为什么下一篇文章只是覆盖了旧的


感谢大家的帮助。

解决了这个问题!!!当你知道问题是什么/曾经是什么的时候,这就非常简单了

我使用的是IB,在我的UILabel上没有选择“Clear Graphics Context”。这就是为什么下一篇文章只是覆盖了旧的


感谢大家的帮助。

尝试在tableView上使用reload()。您能提供您手机的代码吗?ForRowatindexpath谢谢您的回答,今天稍后将尝试其中一些,并相应更新。再次感谢您在tableView上使用reload()。您能为您的CellForRowAtIndexPath添加代码吗谢谢您的回答,今天稍后将尝试其中一些并相应更新。再次感谢这基本上与不重复使用手机是一样的,不是吗?因为我必须重新加载视图?或者在这种情况下使用Nib来更新屏幕上的单元格。除非我遗漏了什么?每当绘制一个单元格时,这段代码都会删除他的子视图。所以你可以再画一次。这样可以避免在另一个视图上方绘制视图。试试这个,如果它不起作用,那么让我知道。如果我这样做,它会使一切进展非常缓慢,只是不重复使用电池和加载新的电池更快。在较旧的设备上同样非常慢,但没有每次删除和重新加载视图那么慢。这与不重用单元基本相同,不是吗?因为我必须重新加载视图?或者在这种情况下使用Nib来更新屏幕上的单元格。除非我遗漏了什么?每当绘制一个单元格时,这段代码都会删除他的子视图。所以你可以再画一次。这样可以避免在另一个视图上方绘制视图。试试这个,如果它不起作用,那么让我知道。如果我这样做,它会使一切进展非常缓慢,只是不重复使用电池和加载新的电池更快。在旧设备上同样非常慢,但没有每次删除和重新加载视图那么慢。不,我正在使用Interface builder并尝试更新其中的标签。但它只是将内容覆盖在以前的内容之上。不,我正在使用Interface builder并尝试更新其中的标签。但它只是将内容覆盖在以前的内容之上。这基本上就是我所拥有的,但是子视图(标签)不会被重放