如何实现`prepareForReuse`?

Posted

技术标签:

【中文标题】如何实现`prepareForReuse`?【英文标题】:How do I implement `prepareForReuse`? 【发布时间】:2015-01-13 18:51:37 【问题描述】:

我正在我的UITableViewCell 中设置一个使用 sdwebimage 下载的图像。为了防止UITableView 显示错误的图像,我需要在prepareForReuse 中将图像设置为nil。但是,我在实现这一点时遇到了一些麻烦。

这是我设置图像的地方:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString * reuseIdentifier = @"programmaticCell";
    MGSwipeTableCell * cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (!cell) 
        cell = [[MGSwipeTableCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
    

    CGFloat brightness = [UIScreen mainScreen].brightness;

    cell.textLabel.text = [self.streams[indexPath.row] name];
    cell.detailTextLabel.text = [self.streams[indexPath.row] published];

    NSString *imageUrl = [NSString stringWithFormat: @"%@", [self.streams[indexPath.row] photo]];

    NSLog(@"Image is: %@ and path is: %d", imageUrl, indexPath.row);

    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl]
                      placeholderImage:[UIImage imageNamed:@"tile-blue.png"] options:indexPath.row == 0 ? SDWebImageRefreshCached : 0];

    cell.delegate = self; //optional

    return cell;

当我实现- (void)prepareForSegue 时,Xcode 不断抛出错误,说cell 对它不可用。实现这一点的正确方法是什么?

【问题讨论】:

prepareForReuse 在您的 MGSwipeTableCell 上实现。在这里,对单元格的引用称为self 而不是cell 但是如果我这样做self.textLabel = nil,它会抛出Property 'textLabel' not found on object of type 'ViewController' 您将ViewController 上的prepareForSegue 误认为是prepareForReuseMGSwipeTableCell 上的实现。转到您的@implementation MGSwipeTableCell 并在那里实施prepareForReuse 你的Q不清楚。你看到的错误是什么?引发错误的代码在哪里? 另见What is the correct way to use prepareForReuse? 【参考方案1】:

尝试将此添加到您的MGSwipeTableCell.m

-(void)prepareForReuse

    [super prepareForReuse];

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

【讨论】:

作为对上述解决方案的评论,Mike 可能知道(只是演示代码):不要实现 prepareForReuse 来重置单元格的内容。它应该只重置外观。来自文档:“出于性能原因,您应该只重置与内容无关的单元格属性,例如,alpha、编辑和选择状态。”。进一步:“tableView:cellForRowAtIndexPath 中的表格视图委托:在重用单元格时应始终重置所有内容”。在 cellForRowAtIndexPath 中设置文本等内容,在prepareForReuse 中重置外观。 感谢您的解释。我其实并不知道。将来我会牢记这一点。通常我在 cellForRowAtIndexPath 中设置内容,但有时会在 prepareForReuse 中重置内容。 不客气!我不久前偶然发现了这一点。在尝试从 UITableView 中获得最佳性能时,请牢记这一点。

以上是关于如何实现`prepareForReuse`?的主要内容,如果未能解决你的问题,请参考以下文章

如何停止使用渐变 UICollectionCell 创建新图层?覆盖 func prepareForReuse()

tableView/collectionView复用prepareForReuse

iOS 杂笔-如何解决tableview显示错乱问题

UITableViewCell的prepareForReuse方法

自定义 UITableViewCells 和正确使用 prepareForReuse 和 removeFromSuperview

iOS 怎么避免tableview刷新数据错乱