简体   繁体   English

UICollection视图

[英]UICollection View

I have a reusable collection view cell. 我有一个可重用的集合视图单元格。 I am trying to set an image at didselect at index path but when i select a cell it return more than cell returning same image. 我正在尝试在索引路径的didselect处设置图像,但是当我选择一个单元格时,它返回的比返回相同图像的单元格还要多。

Here is the code. 这是代码。

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


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell

    cell.userImage.layer.cornerRadius = cell.userImage.frame.size.width/2
    cell.userImage.clipsToBounds = true

    return cell
  }




func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int{
  return 10
  }

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){

    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! CollectionViewCell
    cell.userStatusImage.image = UIImage(named: "selectedcontact.png")

    collectionView.reloadData()

  }

似乎代码collectionView.reloadData()的最后一行会将所有单元格重新加载到初始状态,因为您没有地方检查是否选择了一个特定的单元格。

You need to keep track of the selected cells. 您需要跟踪选定的单元格。

    var selectedIndexes = [Int]()
    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
            return 1
        }


   override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 100
        }

   override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
            if self.selectedIndexes.contains(indexPath.row){
                cell.backgroundColor = UIColor.redColor()
            }
            else{
               cell.backgroundColor = UIColor.whiteColor()
            }

            return cell
        }

   // MARK: UICollectionViewDelegate
   override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

            if selectedIndexes.contains(indexPath.row){
                selectedIndexes.removeObject(indexPath.row)
            }
            else{
                selectedIndexes.append(indexPath.row)
            }
            collectionView.reloadData()
        }

Swift array don't have method to removeObject. Swift数组没有方法来删除对象。 Here is an extension for that 这是一个扩展

extension Array {
    mutating func removeObject<U: Equatable>(object: U) -> Bool {
        for (idx, objectToCompare) in self.enumerate() {
            if let to = objectToCompare as? U {
                if object == to {
                    self.removeAtIndex(idx)
                    return true
                }
            }
        }
        return false
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM