如何不重用 UICollectionView 中的单元格 - Swift

How to NOT reuse cells in UICollectionView - Swift

我在 UITableView 的单元格中有 UICollectionView。此 UICollectionView 显示用户的个人资料照片。那里只有几件物品(假设最多 10 张照片)。

所以,我不想每次重用单元格时都从后端重新加载图像。这是不方便且不友好的用户体验。因此,我想创建 10 个单元格,将图像加载到其中并显示。

但我不知道如何在 UICollectionView 的 "cellForItem" 方法中创建(而不是出队)新的自定义单元格。或者如何禁止重复使用。

我是编程方面的新手,所以如果您用简单的语言和最详细的语言向我解释,我会很高兴。谢谢你。

这是我的代码:

设置 CollectinView(测试时随机上传本地照片):

extension PhotosTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if indexPath.row == 0 {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AddPhotoCollectionViewCell", for: indexPath)
            return cell
        } else {
            var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCollectionViewCell", for: indexPath) as! PhotoCollectionViewCell
            cell.photo = UIImage(named: "Photo\(Int.random(in: 1...8))") ?? UIImage(named: "defaultPhoto")
            cell.layer.cornerRadius = 10

            return cell
        }
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        let height = collectionView.frame.height
        let width = (height / 16.0) * 10.0

        return CGSize(width: width, height: height)
    }

}

我的自定义 PhotoCollectionViewCell:

class PhotoCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var heightConstraint: NSLayoutConstraint!
    @IBOutlet weak var widthConstraint: NSLayoutConstraint!

    var photo: UIImage! {
        didSet {
            // simulate networking delay
            perform(#selector(setImageView), with: nil, afterDelay: Double.random(in: 0.2...1))

            // setImageView()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    @objc private func setImageView() {
        let cellHeight = self.frame.height
        let cellWidth = self.frame.width
        let cellRatio = cellHeight / cellWidth

        let photoRatio = photo.size.height / photo.size.width

        var estimatedWidth = cellWidth
        var estimatedHeight = cellHeight

        if photoRatio > cellRatio {
            estimatedWidth = cellWidth
            estimatedHeight = cellWidth * photoRatio
        } else {
            estimatedHeight = cellHeight
            estimatedWidth = cellHeight / photoRatio
        }

        widthConstraint.constant = estimatedWidth
        heightConstraint.constant = estimatedHeight
        imageView.image = photo
    }

    override func prepareForReuse() {
        imageView.image = nil
    }

}

只需在 cellForItemAt 中创建、填充和 return 新单元格对象,而不是将其出队,但这不是一个好的做法,您不应该这样做。

您每次都需要创建新的单元格并为其赋值。虽然这是非常危险的事情,并且可能会导致您的应用占用太多内存,但您的应用会消耗更多电量并使设备变慢。

相反,我建议您将数据保存到一个集合中,并随时重复使用它。