向下滚动并备份后,UITableViewCell中的图像会发生变化

时间:2017-02-23 23:30:19

标签: ios swift uitableview firebase firebase-realtime-database

我的照片和细胞内有一些标签。如果我有更多的单元格而不是页面上可以放置的单元格,则向下滚动然后再向上加载不同的图像,然后加载原始照片。我已经阅读了StackOverflow以了解在我的情况下会有什么用,但到目前为止我找不到任何东西,因为我的UITableView在ViewController中。

以下是我将内容加载到单元格中的方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PostTableViewCell
    // Configure the cell...
    let post = self.posts[indexPath.row] as! [String: AnyObject]
    cell.titleLabel.text = post["title"] as? String
    cell.priceLabel.text = post["price"] as? String
    if let imageName = post["image"] as? String {
        let imageRef = FIRStorage.storage().reference().child("images/\(imageName)")
        imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil {
            let image = UIImage(data: data!)
            UIView.animate(withDuration: 0.4, animations: {
                cell.titleLabel.alpha = 1
                cell.postImageView.alpha = 1
                cell.priceLabel.alpha = 1
            cell.postImageView.image = image
            })
        } else {
            print("Error occured during image download: \(error?.localizedDescription)")
            }
        })
    }
    return cell
}

我有什么方法可以将tableView.dequeueReusableCell改为不同的东西,这样就不会发生这种情况吗?

2 个答案:

答案 0 :(得分:3)

在表格视图单元格PostTableViewCell中,您需要实现方法

 override func prepareForReuse() {
    super.prepareForReuse()
    self.postImageView.image = nil
    // Set cell to initial state here, reset or set values
}

细胞正在坚持其旧内容

答案 1 :(得分:0)

我认为您遇到问题是因为您更新了完成块中的单元格。如果在运行完成块之前单元格滚出视图,它将被重用于另一行,但您仍然在为上一行设置图像。

试试这个:

imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil {
        if let cell = self.tableView.cellForRow(at: indexPath) as? PostTableViewCell {
            let image = UIImage(data: data!)
            UIView.animate(withDuration: 0.4, animations: {
                cell.titleLabel.alpha = 1
                cell.postImageView.alpha = 1
                cell.priceLabel.alpha = 1
                cell.postImageView.image = image
            }
        })

而不是依赖于仍然可见的单元格,这将尝试从基于indexPath的表格视图中获取它。如果它不再可见,cellForRow(at:)将返回nil