单击 collection 视图中的图像可选择其他图像

Clicking an image in collection view selects other images

我有以下代码:

import UIKit
import Photos
import PhotosUI

private let reuseIdentifier = "Cell"

class CollectionVC: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    var imageArray = [UIImage]()
    
    override func viewDidLoad() {
        super.viewDidLoad()

     grapPhotos()
       

        
    }


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        return imageArray.count
    }

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

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath as IndexPath)
        let imageView = cell.viewWithTag(1) as! UIImageView
        
        collectionView.allowsMultipleSelection = true
        cell.layer.cornerRadius = 4
        imageView.image = imageArray[indexPath.row]
    
        return cell
    }
    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        
        if let cell = collectionView.cellForItem(at: indexPath) {
          cell.layer.borderColor = #colorLiteral(red: 0.1411764771, green: 0.3960784376, blue: 0.5647059083, alpha: 1)
          cell.layer.borderWidth = 5
        
        }
        
        
    }
    
    override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        if let cell = collectionView.cellForItem(at: indexPath) {
          cell.layer.borderColor = #colorLiteral(red: 0.1411764771, green: 0.3960784376, blue: 0.5647059083, alpha: 1)
          cell.layer.borderWidth = 0
        }
    }
    
    func grapPhotos() {
        
        let imgManager = PHImageManager.default()
        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        requestOptions.deliveryMode = .highQualityFormat
        
        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        fetchOptions.predicate = NSPredicate(format: "mediaType = %d || mediaType = %d", PHAssetMediaType.image.rawValue, PHAssetMediaType.video.rawValue)
        
        if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: fetchOptions) {
            
            if fetchResult.count > 0 {
                
                for i in 0..<fetchResult.count {
                    imgManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: {
                        
                        image, error in
                        
                        self.imageArray.append(image!)
                        
                        
                    })
        
                    
                }
            }
            else {
                self.collectionView?.reloadData()
                print("No Photos")
            }
        }
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        
        let width = collectionView.frame.width / 3 - 6
        
        
        
        return CGSize(width: width, height: width)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        
        return 6.0
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        
        return 6.0
    }

}

我很抱歉说了很多,但我真的不知道我哪里出错了。这是我的 CollectionViewController 的所有代码,然后在情节提要中我有一个 collection VC,在一个单元格中有一个图像,标签为 1,然后在一个单元格中,标识符为 "Cell".我遇到的问题是,当我 运行 我的 phone 上的代码时,select 一张图像最终 select 其他图像。例如:我 select 第一张图片,然后向下滚动,另一张图片已经 selected。我做了一点测试,前 21 张图像几乎是独一无二的。但是好像图像几乎具有相同的 ID。与 select 第一张图片一样,也 select 第 22 张图片。顺便说一下,我正在构建一个自定义图像选择器。

这里有不止一个问题,但您抱怨的主要问题是因为您忘记了细胞是重复使用的。您需要在 cellForItem 中配置单元格,而不是在 didSelectdidDeselect.

当您的 didSelect 转身并直接与物理细胞对话时,它在做完全错误的事情。相反,didSelectdidDeselect 应该与您的 数据模型 对话,在模型的对象中设置一些 属性 表示 [=26 处的对象=]这些索引路径应该被认为是被选中的,而这些其他索引路径的对象不应该。然后重新加载数据。

然后,当 cellForItem 出现时,它必须根据数据模型和索引 完全 配置其单元格,显示其选择的外观或未选择的外观小路。这样,如果一个单元格位于先前选定的行中,但现在在未选定的行中重复使用,则它具有所需的未选定外观。

换句话说,只有 cellForItem 应该用细胞来思考。其他人应该只考虑索引路径(或者更好,根据与数据关联的某些唯一标识符,但这是另一回事)。