UICollectionView didSelectItemAt / didUnselectItemAt不起作用

时间:2016-12-29 15:24:53

标签: ios uicollectionview swift3 uicollectionviewcell

我有一个UICollectionView,我实施了collectionView(_:didSelectItemAt:)collectionView(_:didDeselectItemAt:)。当我滚动到集合视图的底部并选择它时,我希望它保持选中状态,因此我不会在collectionView(_:didDeselectItemAt:)中调用collectionView(_:didSelectItemAt:)。现在,问题是当我从底部的选定单元格滚动到顶部的单元格时,应用程序崩溃unexpectedly found nil while unwrapping an Optional value。我的胆量告诉我这与引擎盖下的细胞出列有关。

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as! ServiceMenuItemCell
        cell.backgroundColor = UIColor(colorLiteralRed: 0/255.0, green: 138/255.0, blue: 217/255.0, alpha: 1.0)

        UIView.animate(withDuration: 0.1, animations: {
            cell.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
        }, completion: { finish in
            UIView.animate(withDuration: 0.05, animations: {
                cell.transform = CGAffineTransform.identity
            })
        })
    }

    override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as! ServiceMenuItemCell
        cell.backgroundColor = UIColor(colorLiteralRed: 177/255.0, green: 179/255.0, blue: 181/255.0, alpha: 1.0)
    }

我该如何正确解决这个问题?

1 个答案:

答案 0 :(得分:0)

你有两个问题:

  • didDeSelectItemAt中的安全展开以避免崩溃
  • 出于预期目的:在DidSelectAtIndex
  • 中撤消您在didDeSelectItemAt中已完成的操作

代码

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            let cell = collectionView.cellForItem(at: indexPath) as! ServiceMenuItemCell
            cell.backgroundColor = UIColor(colorLiteralRed: 0/255.0, green: 138/255.0, blue: 217/255.0, alpha: 1.0)

    UIView.animate(withDuration: 0.1, animations: {
        cell.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
    }, completion: { finish in
        UIView.animate(withDuration: 0.05, animations: {
            cell.transform = CGAffineTransform.identity
        })
    })
}

override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    guard let cell = collectionView.cellForItem(at: indexPath) as! ServiceMenuItemCell else {return}
    cell.backgroundColor = UIColor(colorLiteralRed: 177/255.0, green: 179/255.0, blue: 181/255.0, alpha: 1.0)
}

另外还有关于选择2个单元格的问题:

在你的didSelectItemAt你在做什么?你正在改造细胞。所以在你的didSelect中你必须撤消你所做的一切。我的意思是你的didDeSelectItemAt 正在工作,但是你所做的任何突变都必须撤消。 didDeselectItemAt可以帮助您在合适的时间执行此操作。我不确定你的选择是如何运作的,但我认为你知道的更好,只需撤消它。

知道它是否有效