我在我的ReusableCell
方法中使用cellForRowAtIndexPath
;
NSDictionary *cellData = [_cellArray objectAtIndex:indexPath.row];
static NSString *kCellID = @"homePage";
_cell = (HomePageCell*) [tableView dequeueReusableCellWithIdentifier:kCellID];
if(_cell == nil)
{
_cell = [[HomePageCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellID withDictionary:cellData];
}
__weak typeof(_cell) weakSelf = _cell;
[_cell.rootImageView setImageWithURLRequest:_cell.requestImage placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
{
weakSelf.rootImageView.image=image;
} failure:nil];
和我的rootImageView
对象正在配置。我的问题是在滚动之后开始;
在Cell-1中,rootImageView.image应为Image-1 在Cell-2中,rootImageView.image应该是Image-2 在Cell-3中,rootImageView.image应该是Image-3
当我开始滚动并且我的代码出现if(_cell == nil)
时,我的所有图像都返回与Image-1相同的图像。但是,当我记录[_cellArray description]
时,数据完全正确。我错过了什么?为什么所有细胞图像在细胞不是零后转回Image-1?
编辑:这真的很奇怪,如果我不使用kCellID图片加载正确。我将_cell
属性切换为HomePageCell *cell
。
答案 0 :(得分:1)
正如其他人已经指出的,看起来你将_cell
存储为实例变量。永远不要这样做,因为每个单元格实例必须“动态”出列/创建,因为它们被要求显示在屏幕上。
如果您的UITableViewCell
实例是自定义子类(我假设它是),您应该覆盖其-prepareForReuse
方法,您应该在其中设置imageView
的{{1}} }属性到image
。否则,您可以在nil
实施中为其分配nil
值。
此外,由于单元格快速排队/重新使用/丢弃的方式,您应检查在从网络到达正确单元格时分配所请求的图像。为此,不要保留对单元格的弱引用(正如您所做的那样),而是在网络请求完成块内部获取具有所需indexPath的单元格的新引用。
总之,您的实现应如下所示:
-tableView: cellForRowAtIndexPath:
答案 1 :(得分:0)
我认为_cell
是你班上的一个属性,这是错误的。 从不将单元格存储为属性,并不意味着存储!只需创建一个局部变量并将图像分配给它。这也不是一个好主意,但它应该至少起作用。
UITableView
的理论是你提供单元一次,然后你就不要修改它!如果需要,可以重新加载表格视图,它会再次询问您的单元格,然后您可以修改这种方式。你永远不应该存储任何类型的指针UITableViewCell
或它的任何子类。
答案 2 :(得分:0)
我假设您从cellData
获取了该网址,在这种情况下问题是您没有重置此属性,因此当重用某个单元格时,您仍然使用cellData
中的initWithStyle:reuseIdentifier:withDictionary:
{1}}方法。你应该做点什么:
if(_cell == nil)
{
_cell = [[HomePageCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellID withDictionary:cellData];
} else {
[_cell setCellData:cellData];
}