Swift 2 – 调用`didDeselectItemAtIndexPath`时发生致命错误
我有一个UICollectionView
我使用函数didSelectItemAtIndexPath
select一个单元格,并更改其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 } }