0

我有一个包含标签和图像的自定义单元格的表格视图,加载时它很好,所有单元格都正确显示。

但是,当我向下滚动时,因为有超过 200 个单元格,当我向上滚动时,单元格中的单元格数据会发生变化 - 例如 - 我可能有正确的图像但错误的标签或错误的图像但正确的标签。我不确定我做错了什么。

到目前为止,这是我的代码:

import UIKit

class SearchTableViewCell: UITableViewCell {

static let identifier = "SearchTableViewCell"

@IBOutlet var loader: UIActivityIndicatorView!
@IBOutlet var nameLabel: UILabel!
@IBOutlet var addressLabel: UILabel!
@IBOutlet var locationImageView: UIImageView!
var currentIndexPath: IndexPath?

override func awakeFromNib() {
    super.awakeFromNib()
    
    nameLabel.font = UIFont(name: Settings.shared.MAIN_APP_FONT_BOLD, size: 25)
    nameLabel.textColor = .white
    nameLabel.numberOfLines = 1
    
    addressLabel.font = UIFont(name: Settings.shared.MAIN_APP_FONT_BOLD, size: 15)
    addressLabel.textColor = .white
    addressLabel.numberOfLines = 0
    
    locationImageView.clipsToBounds = true
    locationImageView.layer.cornerRadius = 8.0
    locationImageView.contentMode = .scaleAspectFill
}

func configure(with urlString: String, name: String, address: String, station: String) {

    loader.startAnimating()
    loader.isHidden = false
    
    guard let url = URL(string: urlString) else {
        return
    }
    
    let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
        guard let data = data, error == nil else {
            return
        }
        
        let locationImage = UIImage(data: data)
        
        DispatchQueue.main.async {
            self?.nameLabel.text = name
            self?.addressLabel.text = address
            self?.locationImageView.image = locationImage
            self?.loader.stopAnimating()
            self?.loader.isHidden = true
        }
    }
    task.resume()
    
   
}

static func nib() -> UINib {
    return UINib(nibName: "SearchTableViewCell", bundle: nil)
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
}

override func prepareForReuse() {
    super.prepareForReuse()
    nameLabel.text = nil
    locationImageView.image = nil
    currentIndexPath = nil
}

}

4

1 回答 1

1

您正在异步加载单元格的内容。将UITableView重用单元格。所以假设:

  1. 您被要求创建一个单元格。您开始异步加载单元格内容。
  2. 在内容可以加载之前,用户将单元格滚动出屏幕。系统获取单元并将其放入重用队列中。(第 1 步的负载仍在进行中)
  3. 系统将单元格从重用队列中拉出,调用重用回调(将内容清零)并将其放回表格视图中。(第 1 步的负载仍在进行中)
  4. 来自步骤 1 的异步加载最终完成并将单元格中的值设置为其内容。

现在,您在步骤 1 中拥有的单元格与刚刚放在表中其他位置的新单元格相同,但它具有错误的内容,因为您的异步加载在单元格被重用后完成。

该单元格仅用于显示信息......它不应该加载数据。数据源是加载数据的人。您需要重新考虑您的设计并更改加载数据的位置。

于 2021-09-27T23:49:30.183 回答