我正在使用didSelectItemAt和didDeselectItemAt进行多次选择collectionViewCell。我想选择单元格并选择边框为蓝色(如果已选中),并取消选中“已选中”单元格并使边框保持默认状态。但我的问题是didDeselectItemAt被交替调用。当我点击任何一个单元格然后调用了SelectItemAt,如果我点击任何其他单元格,则调用didDeselectItemAt。我猜这不应该发生。只有当我点击已经选择的单元格时才应该调用didDeselectItemAt。如果我出错了,请纠正我。我已提到这个UICollectionView - didDeselectItemAtIndexPath not called if cell is selected 1,但dint对我有效:(
public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
let cell = collectionView.cellForItem(at: indexPath) as! MomentDetailCell
let moment = self.arrOfMoments[indexPath.row] as! MomentModel
cell.toggleSelection(moment: moment)
self.arrOfDeletingImgs.append(moment)
}
public func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath)
{
let cell : MomentDetailCell = self.collectionViewImages.cellForItem(at: indexPath) as! MomentDetailCell
let moment = self.arrOfMoments[indexPath.row] as! MomentModel
cell.toggleSelection(moment: moment)
self.arrOfDeletingImgs.remove(at: (find(objecToFind: moment))!)
}
//这也是我在课堂上使用的代码。我还在viewdidload
中使allowMultipleSelection为true extension MomentDetailViewController : UICollectionViewDelegateFlowLayout
{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
return CGSize(width: 75, height: 75)
}
}
//这是我的customCell代码
func toggleSelection( moment : MomentModel)
{
if (isSelected)
{
moment.isSelected = true
self.layer.borderWidth = 3
self.layer.borderColor = Constant.APP_BLUE_COLOR.cgColor
}
else
{
moment.isSelected = false
self.layer.borderWidth = 1
self.layer.borderColor = UIColor.red.cgColor
}
}
答案 0 :(得分:4)
试试这个:
此多重选择解决方案
1- make deSelect如下
public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
let cell = collectionView.cellForItem(at: indexPath) as! MomentDetailCell
let moment = self.arrOfMoments[indexPath.row] as! MomentModel
cell.toggleSelection(moment: moment)
self.arrOfDeletingImgs.append(moment)
}
2 - 评论/删除取消选择方法
此方法有3项改变
func toggleSelection( moment : MomentModel)
{
moment.isSelected = !moment.isSelected
self.layer.borderWidth = moment.isSelected ? 3 : 1
self.layer.borderColor = moment.isSelected ? Constant.APP_BLUE_COLOR.cgColor : UIColor.red.cgColor
}
答案 1 :(得分:2)
我猜当你点击第二个单元格时会调用didselect方法。你可能忘记了:
_collectionView.allowsMultipleSelection = YES
答案 2 :(得分:2)
经过很长一段时间我解决了问题,这对我有用......
我在cellForItemAtIndexPath中做了以下事情:错误
cell.isSelected = false
collectionView.selectItem(at:indexPath,animated:false,scrollPosition:.left)
我这样做是因为在不考虑细胞选择的情况下,交替调用了取消选择。我刚刚解开了这段代码,它对我有用。现在didSelect正在调用第一次点击,如果我再次点击同一个单元格,那么只根据预期的流量调用didDeselect。
同时确保allowMultipleSelection为true且allowSelection为true
答案 3 :(得分:0)
在我的情况下,我有一个单独的委托类,如果我设置了collectionView.delegate = MyDelegate()
,它就没有用,如果我在视图控制器中存储了一个var myDelegate = MyDelegate()
,然后又以某种方式设置了collectionView.delegate = myDelegate
,