如何实现`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
误认为是prepareForReuse
在MGSwipeTableCell
上的实现。转到您的@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
UITableViewCell的prepareForReuse方法
自定义 UITableViewCells 和正确使用 prepareForReuse 和 removeFromSuperview