Swift 2 – 调用`didDeselectItemAtIndexPath`时发生致命错误

我有一个UICollectionView我使用函数didSelectItemAtIndexPathselect一个单元格,并更改其alpha。

UICollectionView有12个单元格。

为了将取消选中的单元格返回到alpha = 1.0我使用函数didDeselectItemAtIndexPath

到目前为止,代码工作,但是,当我select一个单元格,并滚动UICollectionView应用程序崩溃在线let colorCell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! 里面的错误取消selectfunction:

致命错误:意外地发现零,而解包一个可选的值(lldb)

我想我需要重新加载收集视图,但如何重新加载并保持单元格select?

 override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { let colorCell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! colorCell.alpha = 0.4 } override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { let colorCell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! colorCell.alpha = 1.0 } 

发生崩溃的原因是,您select并滚动出屏幕可见区域的单元格已被重新用于集合视图中的其他单元格。 现在,当您尝试使用cellForItemAtIndexPath获取didDeselectItemAtIndexPath中的选定单元格时,会导致崩溃。

为了避免崩溃,如@Michael Dautermann所述,使用可选的绑定来validation单元格是否为零,然后设置alpha

 func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { if let cell = collectionView.cellForItemAtIndexPath(indexPath) { cell.alpha = 1.0 } } 

为了在滚动期间保持select状态,请检查单元格的select状态,并在将单元格出队在cellForItemAtIndexPath方法中时相应地设置您的alpha

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) if cell.selected { cell.alpha = 0.4 } else { cell.alpha = 1.0 } return cell } 

cellForItemAtIndexPath似乎是返回一个可选的,所以为什么不做:

 override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { if let colorCell = collectionView.cellForItemAtIndexPath(indexPath) { colorCell.alpha = 1.0 } }