我有一个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)
}
我该如何正确解决这个问题?
答案 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
可以帮助您在合适的时间执行此操作。我不确定你的选择是如何运作的,但我认为你知道的更好,只需撤消它。
知道它是否有效