didSelectItemAt和didDeselectItemAt在swift 3.0中没有按预期工作

时间:2017-07-17 06:09:29

标签: ios objective-c swift3 uicollectionviewcell

我正在使用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
    }
}

4 个答案:

答案 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