我有一个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的选择。我的意思是我不想允许选择特定的细胞。
答案 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
}