如何返回第一个collectionview单元格项目?

时间:2018-07-25 20:46:04

标签: ios swift uicollectionview uicollectionviewcell uicolor

我正在UICollectionViewCell上为我的移动应用程序工作。轻按crossBtn时,它应该转到第一个UICollectionViewCell并重新加载数据,但是collectionView?.reloadData()会使颜色混乱,并且每个单元格一次都不会停留一种颜色。相反,即使我在UIColor.clear方法中将颜色设置为didDeselectItemAt,它仍然在单元格上显示多种颜色。

当用户在不重新加载整个UICollectionViewCell的情况下点击crossBtn时,如何返回第一个UICollectionView项目?

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

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

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


        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell

        cell.hamburgerLabel.text = filters[indexPath.item]

//        cell.hamburgerImageView.image = filterImages[indexPath.item]

        return cell
    }


func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.layer.backgroundColor = UIColor.gray.cgColor
    setFilter(title: filterNames[indexPath.row])
    toolBar.isHidden = true
    yesAndNoToolBar.isHidden = false
}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)
    cell?.layer.backgroundColor = UIColor.clear.cgColor
    collectionView.deselectItem(at: indexPath, animated: true)
}


@IBAction func crossBtn(_ sender: UIBarButtonItem) {
    toolBar.isHidden = false
    yesAndNoToolBar.isHidden = true

    collectionView?.reloadData()

    let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
    self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionViewScrollPosition.centeredVertically)

}

1 个答案:

答案 0 :(得分:0)

您可能不必重新加载数据。您可以使用以下方法滚动到给定的索引路径。

let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
func scrollToItem(at indexPath: indexPath, 
               at scrollPosition: .centeredVertically, 
         animated: true)

请注意,这与使用selectItem(at:animated:scrollPosition:)不同。

此外,您应该在cellForItem方法中而不是在选择和取消选择委托方法中设置遇到问题的颜色等。这是因为单元格已被重用,所以在滚动时,您正在设置样式的单元格将在其他位置使用。而是使用选择和取消选择方法将所选索引路径存储在变量(或多个数组)中,然后在cellForItem中检查此数组,以确定是否将所选样式应用于该单元格。这就是collectionView.reloadData()为您搞砸的原因!