重复使用的细胞在清爽的图像中滞后

时间:2015-03-31 20:01:27

标签: ios swift tableview

这里的主要问题是我将图像加载到自定义单元格中,当滚动时,重用的单元格在加载新图像时显示旧图像。

坦率地说,不会有很多单元格,所以我的第一个想法是我可以使用tableView.dequeueReusableCellWithIdentifier,但是我想看看每个地方都试图找出这个问题或者人们会问为什么会有人这样做这个,或者他们只是在没有某种例子的情况下提供含糊的建议。

在重新处理图像时显示没有这种滞后的单元格的最佳方法是什么?

enter image description here

class FavoritesPropertyViewCell: UITableViewCell {
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
    @IBOutlet weak var cellPropertyImage: UIImageView!
    @IBOutlet weak var cellRoomsValue: UILabel!
    @IBOutlet weak var cellSpaceValue: UILabel!
    @IBOutlet weak var cellPriceRangeValue: UILabel!
    @IBOutlet weak var cellCityStateZipValue: UILabel!
    @IBOutlet weak var cellAddressValue: UILabel!

}

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{         


            var newPropertyCell: FavoritesPropertyViewCell = tableView.dequeueReusableCellWithIdentifier("FavoritesPropertyCell", forIndexPath: indexPath) as FavoritesPropertyViewCell

//... Get image, format values ...


                // Put everything in the labels.
                newPropertyCell.cellRoomsValue.text = roomsValue
                newPropertyCell.cellSpaceValue.text = spaceValue
                newPropertyCell.cellPriceRangeValue.text = priceValue
                newPropertyCell.cellAddressValue.text = addressValue
                newPropertyCell.cellCityStateZipValue.text = cityStateZipValue

                return newPropertyCell

    }

4 个答案:

答案 0 :(得分:1)

由于滚动速度与网络加载速度的比较,使用标准UIImageView时无法解决问题。

我的经验表明,使用图像缓存绝对需要它。 有一些cocoapod实现了图像缓存,您可以检查AsyncImageView或NPRImageView

答案 1 :(得分:1)

您应该使用占位符图像并将图像设置为初始化和重用单元格时的图像,在MyCell.m中添加如下内容:

- (void)awakeFromNib {

    [super awakeFromNib];

    UIImage *placeHolder = [UIImage imageNamed:@"profilePlaceholder"];
    self.propertyImage=placeholder;

}

-(void)prepareForReuse {

    //this is called each time we reuse a cell
    UIImage *placeHolder = [UIImage imageNamed:@"profilePlaceHolder"];
    self,propertyImage=placeHolder;

}

现在您还要做的是创建一个图像缓存,这可以只是一个NSMutableDictionary,然后在您的单元格创建中执行以下操作:

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

    MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    UIImage *cachedImage = self.images[cell.propertyName];
            if (cachedImage) {
                //use cached image
                cell.propertyImage=cachedImage;
            }

            else {

                 //your image download code here



                 //then add the image to the dictionary
                 [self.images setObject:downloadedImage forKey:cell.popertyName];

                //and set it
                cell.propertyImage = downloadedImage;
}

无论如何,这些都是基础。

如果您不想使用dequeue,则只需将单元格创建更改为:

MyCell *cell = [[MyCell init] alloc]; 

或者你启动你的细胞...

答案 2 :(得分:0)

如果您要从网络加载图片,请在设置新图片之前尝试设置cell.image = nil。它将至少清除图像,而下一个图像加载到位。

答案 3 :(得分:0)

我找不到一种方法来使用tableView.dequeueReusableCellWithIdentifier,而不是将单元格放入自己的xib并以这种方式调用它(我可能最终会做长期运行)然而,为了防止看起来像是这个图像重新加载,现在我只是在实例化newPropertyCell之后立即将图像设置为占位符。

引用一个不存在的图像会带回任何我想要发生的事情。

注意:"占位符"是对不存在的文件的引用,而不是错误,它不返回任何内容。

var newPropertyCell: FavoritesPropertyViewCell = tableView.dequeueReusableCellWithIdentifier("FavoritesPropertyCell") as FavoritesPropertyViewCell

newPropertyCell.cellPropertyImage.image = UIImage(named: "placeholder") 

稍后我可能会回来并缓存图像,以便有更强的持久性,我不必点击API来检查图像,或者在滚动时再次下载。

全部谢谢!