Swift 2 - 调用`didDeselectItemAtIndexPath`时出现致命错误

时间:2015-11-27 17:10:09

标签: ios uicollectionview swift2 fatal-error didselectrowatindexpath

我有一个UICollectionView,我使用函数didSelectItemAtIndexPath来选择一个单元格并更改其alpha。

UICollectionView中有12个单元格。

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

到目前为止,代码工作正常,当我选择一个单元格时,我在取消选择函数内的UICollectionView行上滚动let colorCell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)!应用程序崩溃并显示错误:

  

致命错误:在展开Optional值时意外发现nil   (LLDB)

我想我需要重新加载集合视图但是如何重新加载并保持单元格的选择?

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
    }

2 个答案:

答案 0 :(得分:2)

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

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

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

为了在滚动期间保持您的选择状态,请检查单元格的选择状态,并在alpha方法

中将单元格出列时相应地设置cellForItemAtIndexPath
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
}

答案 1 :(得分:1)

cellForItemAtIndexPath似乎正在返回一个可选项,所以为什么不这样做:

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