为什么集合视图中的选定单元格在 UICollection 视图中无法正确显示 Swift 3?

why selected cell in collection view doesn't show correctly in the UICollection View Swift 3?

我正在使用 swift 3,我的应用程序中有集合视图,其中显示 iPhone 画廊。一切都很好但我希望用户可以 select 一些照片,这可能会发生但问题是我在每个单元格中使用了另一个小图像,当用户 select 该单元格时图片将显示用户可以理解该单元格已被 select 编辑的勾号 - 这将在开始时起作用,但是当用户滚动集合视图时,一些用户没有 select 的单元格也有这个勾号! **请记住,select 和 did deselect 运行良好,问题仅在于显示此勾号 ** **我在单元格中有带有标签的图像,当用户 select 单元格或 didDeselect **

时,该图像将显示勾号或不显示任何内容

我知道这些代码比你想象的要多但是很多人需要访问所有代码所以你可以在下面看到我的代码

 import UIKit
 import Photos
 class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
let arr_img = NSMutableArray()

@IBOutlet var collview: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    let allPhotosOptions : PHFetchOptions = PHFetchOptions.init()
    allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
    let allPhotosResult = PHAsset.fetchAssets(with: .image, options: allPhotosOptions)
    allPhotosResult.enumerateObjects({ (asset, idx, stop) in

        self.arr_img.add(asset)
    })

}
func getAssetThumbnail(asset: PHAsset, size: CGFloat) -> UIImage {
    let retinaScale = UIScreen.main.scale
    let retinaSquare = CGSize(width: size * retinaScale, height: size * retinaScale)//CGSizeMake(size * retinaScale, size * retinaScale)
    let cropSizeLength = min(asset.pixelWidth, asset.pixelHeight)
    let square = CGRect(x: 0, y: 0, width: cropSizeLength, height: cropSizeLength)//CGRectMake(0, 0, CGFloat(cropSizeLength), CGFloat(cropSizeLength))
    let cropRect = square.applying(CGAffineTransform(scaleX: 1.0/CGFloat(asset.pixelWidth), y: 1.0/CGFloat(asset.pixelHeight)))

    let manager = PHImageManager.default()
    let options = PHImageRequestOptions()
    var thumbnail = UIImage()

    options.isSynchronous = true
    options.deliveryMode = .highQualityFormat
    options.resizeMode = .exact
    options.normalizedCropRect = cropRect

    manager.requestImage(for: asset, targetSize: retinaSquare, contentMode: .aspectFit, options: options, resultHandler: {(result, info)->Void in
        thumbnail = result!
    })
    return thumbnail
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//MARK:
//MARK: Collectioview methods
func collectionView(_ collectionView: UICollectionView,
                    numberOfItemsInSection section: Int) -> Int {
    return arr_img.count
}
func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
                                                  for: indexPath)
    let imgview : UIImageView = cell.viewWithTag(20) as! UIImageView
    imgview.image = self.getAssetThumbnail(asset: self.arr_img.object(at: indexPath.row) as! PHAsset, size: 150)

    return cell
}

}

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
 let cell = collectionView.cellForItem(at: indexPath as IndexPath)
    if cell!.isSelected == true {


        print(indexPath)
        cell?.backgroundColor = UIColor.orange
        print("Cell is Selected!")
        let selectView : UIImageView = cell?.viewWithTag(22) as! UIImageView
        selectView.image = UIImage(named: "Select.png")
    }

    else if cell!.isSelected != true        {

        collectionView.cellForItem(at: indexPath as IndexPath)

    cell?.backgroundColor = UIColor.clear
        let selectView : UIImageView = cell?.viewWithTag(22) as! UIImageView
        selectView.image = nil

        print("Cell is  Not Selected!")

    }

}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath as IndexPath)

    print(indexPath)
    if cell?.isSelected == true {
        cell?.backgroundColor = UIColor.orange
        print("Cell is Selected In Deselect!")
        let selectView : UIImageView = cell!.viewWithTag(22) as! UIImageView
        selectView.image = nil
        collectionView.cellForItem(at: indexPath as IndexPath)

    }
    else if cell?.isSelected != true        {
        cell?.backgroundColor = UIColor.clear
        collectionView.cellForItem(at: indexPath as IndexPath)

        print("Cell is DeSelected!")
        let selectView : UIImageView = cell!.viewWithTag(22) as! UIImageView
        selectView.image = nil


    }

}

只需在您的单元格内放置一个按钮并为其添加标签。

获取数组并执行以下操作。

let arr_selected = NSMutableArray()

func collectionView(_ collectionView: UICollectionView,
                        cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
                                                      for: indexPath)

        let btn_check : UIButton = cell.viewWithTag(30) as! UIButton
        if arr_selected.contains(indexPath.row){
            btn_check.isSelected = true
        }else{
            btn_check.isSelected = false
        }
        return cell
    }
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
        if arr_selected.contains(indexPath.row){
            arr_selected.remove(indexPath.row)
        }else{
            arr_selected.add(indexPath.row)
        }
        self.collview.reloadData()
    }

如果你想要演示,那么你可以从HERE

下载