1

我有一個UICollectionView,我使用函數didSelectItemAtIndexPath來選擇一個單元並更改其alpha。Swift 2 - 調用didDeselectItemAtIndexPath時發生致命錯誤

UICollectionView有12個單元格。

爲了取消選中的單元格返回到alpha = 1.0我使用函數didDeselectItemAtIndexPath

到目前爲止代碼工作然而,當我選擇一個單元格,我滾動的取消函數內部的線let colorCell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)!有錯誤的UICollectionView應用程序崩潰:

fatal error: unexpectedly found nil while unwrapping an Optional value (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

事故發生的原因是您選擇和滾動在屏幕的可見區域的細胞已被其他重用收集視圖中的單元格。現在,當您嘗試使用cellForItemAtIndexPathdidDeselectItemAtIndexPath中提取所選單元格時,會導致崩潰。

爲了避免撞車,由@邁克爾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 
} 
+0

謝謝你這麼多的解釋..非常清晰,其工作 – SNos

1

cellForItemAtIndexPath似乎返回一個可選的,所以爲什麼不這樣做:

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