UItableviewcell在ios中重用问题

时间:2015-11-03 09:39:16

标签: ios objective-c iphone xcode uitableview

大家好,我想几乎所有参与ios开发的人都可能会遇到使用以下代码行重用UITableCell的问题。

 RZRestaurantListingCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

我对此有很多搜索,但没有得到任何愿望的答案,所以请在这种情况下帮助我。

我遇到的问题与大多数iPhone开发人员在重复使用该单元后有同样的问题。 我的单元格中有UIProgressView,下载视频有一个按钮,我正在显示正在进行中的进度视图还剩下多少。 所以现在我有问题的是,当我有更多的数据并且当时离开屏幕我按下UITableviewCell的第一行上的下载按钮然后我向下滚动所以进度也显示在底部随机一个单元格中所以UI在两个单元格而不是一个单元格中更改。

3 个答案:

答案 0 :(得分:1)

您需要在自定义单元格类中实现-prepareForReuse方法,并将所有单元格属性设置为默认值。

- (void)prepareForReuse
  

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用性   identifier - 在返回对象之前调用此方法   来自UITableView方法dequeueReusableCellWithIdentifier:。对于   性能原因,你应该只重置那个单元格的属性   与内容无关,例如,alpha,编辑和选择   州。 tableView中的表视图委托:cellForRowAtIndexPath:   重复使用单元格时应始终重置所有内容。如果是细胞   对象没有关联的重用标识符,此方法是   不叫。如果重写此方法,则必须确保调用   超类实现。

请参阅此处了解更多信息,https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewCell_Class/#//apple_ref/occ/instm/UITableViewCell/prepareForReuse

答案 1 :(得分:0)

在使用之前,使用prepareforreuse methodclear个单元格的内容......例如。

-(void)prepareForReuse
{
    [super prepareForReuse];

    self.textLabel.text = @"";
    self.detailTextLabel.text = @"";
    self.imageView.image = nil;
} 

答案 2 :(得分:0)

您需要在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

中分配进度值
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    RZRestaurantListingCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // If the cell is reused, the `-prepareForReuse:` of `UITableViewCell` will be called.

    //!! Assign current progress value to this cell, otherwise, the progressBar.value may look like a random value. 
    //!! Because the current cell is reused from a disappeared cell.
    cell.progressBar.value = ... ;

    return cell;
}

设计可能很复杂,因为当单元格在屏幕上时,进度可能会不断更新。