2011-06-06 77 views
0

我正在使用自定义的UITableViewCell。它们装载得很好,但是当它们被重新使用而不是替换标签中的文本时,它们是如何写在其上面的。任何想法如何阻止这种行为?UITableViewCell - 重用时在数据顶部显示数据的视图

我假设在重用之前我没有正确重置视图。我目前是空的标签,所以他们只有一个空白的@“”字符串。但我仍然得到旧文本加上新的(非常混乱)。我确定有一个明显的解决方案(目前我只是不重用该单元格,但这不是最佳实践,并且在旧设备上很慢),所以如果有人可以帮助我会很感激。

感谢

ED

如这里要求是修改小区

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; 

}

+0

尝试在tableView上使用reload()... – 2011-06-06 15:57:20

+0

您可以包含您的cellForRowAtIndexPath的代码 – Dancreek 2011-06-06 16:22:40

+0

感谢您的答案,将在今天晚些时候尝试其中一些并相应地进行更新。再次感谢 – Harold 2011-06-08 10:13:37

回答

2

解决了这个问题!令人惊讶的是,当你知道问题出在什么地方时很简单。

我正在使用IB和“清除图形上下文”未在我的UILabels上选择。所以这就是为什么下一个文本只是覆盖旧的。

谢谢你们的帮助。

1

你是在细胞被重新使用正确的方法。您的代码应大致使用以下模式设置:

- (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之间的任何位置)。这有助于确保平滑的滚动体验,无论该单元格有多少行,因为渲染器无需担心动态更改单元格的高度。

+0

这基本上就是我所拥有的,但子视图(标签)并没有取代他们的内容,而只是将其覆盖在旧内容上。我试着先清空标签文本属性,但没有区别。 – Harold 2011-06-09 09:30:19

+0

你如何添加子视图?在重用它们时,如何获取缓存单元格中子视图的引用? – csano 2011-06-09 15:50:30

+0

我在IB中引用它们,并在setData时更改它们。这将数据对象解析为单元格,单元格和单元格更新它的标签。它还释放旧数据。 – Harold 2011-06-10 09:18:33

1

我怀疑你是在你的cellForRowAtIndexPath方法中以编程方式添加标签作为子视图。您需要确保每次单元回收时都不添加子视图。相反,只有在创建新单元格时创建标签(而不是在回收单元格时),然后为标签分配标签值,然后在将其回收时,通过标签值检索标签并更改其文本。

+0

不,我正在使用“接口”构建器并尝试更新其中的标签。但它只是覆盖以前内容的内容。 – Harold 2011-06-09 09:28:47

1

试试这个..

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

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

这基本上与不重复使用Cell相同,不是吗?由于我不得不重新加载视图?或笔尖在这种情况下更新屏幕上的单元格。除非我错过了什么? – Harold 2011-06-09 09:28:00

+0

每当一个单元格被绘制时,这段代码将删除他的子视图。所以你可以再画一遍。这将避免将视图绘制在另一个视图之上。试试这个,如果它不起作用,那就让我知道。 – 2011-06-09 10:10:32

+0

如果我这样做,它会使一切进行得非常缓慢,而且不重复使用这些单元并加载新单元会更快。旧设备上的速度仍然很慢,但速度不如每次删除和重新加载视图时慢。 – Harold 2011-06-10 09:19:53