如何在collectionView(_:didSelectItemAt :)处调用selectItemAt:函数?

时间:2019-11-26 08:00:16

标签: ios swift uicollectionview

我有一个UICollectionView,而collecitonView有足够的项目。
通过触摸选择了第5个单元格后,我想取消第5个单元格的选择并返回到上一个选定的单元格。
UICollectionView具有以下选项。

var lastSelectedIndexPath: IndexPath
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
collectionView.allowsMultipleSelection = false
collectionView.allowsSelection = true

...

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    if shouldRollBackSelection {
        // just test code
        collectionView.selectItem(at: lastSelectedIndexPath, animated: false, scrollPosition: UICollectionView.ScrollPosition())
    } else {
        lastSelectedIndexPath = indexPath
    }
}

如果调用collectionView.selectItem(...)函数,则上次选择的单元格的isSelected属性的didSet将被调用两次。
第一次调用为“假”为真,第二次调用为“真”为“假”。结果,最后选择的单元格的isSelected属性为false。

我想回滚UICollectionView的Cell的选择。我的意思是我不想允许选择特定的细胞。

3 个答案:

答案 0 :(得分:1)

这不是最好的方法,但是您可以在设置最后一个索引之前添加一个guard以防止重复调用:

guard lastSelectedIndexPath != indexPath else { return }

答案 1 :(得分:1)

最好用以下方法停用cellForItemAt重载中的单元格选择:

     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCel", for: indexPath) as! UpperCollectionViewCell
        if indexPath.row == 4 {
           cell.isUserInteractionEnabled = false
        }
        return cell
    }

答案 2 :(得分:1)

禁用那些您不想选择的单元格的用户交互功能

 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
    if indexPath.row == 4 {
        cell.isUserInteractionEnabled = false
    }
    return cell

  }