配置UITableViewCell的正确形式是什么?

时间:2014-05-05 12:35:54

标签: ios uitableview

我在我的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

3 个答案:

答案 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];
}