1

У меня есть UICollectionView, где я использую функцию didSelectItemAtIndexPath, чтобы выбрать ячейку и изменить ее альфу.Swift 2 - Fatal Error, когда `didDeselectItemAtIndexPath` называется

В UICollectionView имеется 12 ячеек.

Для того, чтобы снять выделенные ячейки обратно до alpha = 1.0 Я использую функцию didDeselectItemAtIndexPath.

Пока код работает, однако, когда я выбираю ячейку, и я прокручивать UICollectionView сбои приложения на линии let colorCell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! внутри функции смешивани с ошибкой:

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

Крушения произошло потому, что клетка, выбранная и прокручивается из видимой области экрана, была повторно использована для других ячейки в виде коллекции. Теперь, когда вы пытаетесь извлечь выбранную ячейку в didDeselectItemAtIndexPath, используя cellForItemAtIndexPath, это привело к сбою.

Чтобы избежать аварии, как было упомянуто @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 
} 
+0

Большим спасибо за объяснение .. Очень ясно и его работа – SNos

1

cellForItemAtIndexPath кажется, возвращается необязательным, так почему бы не сделать:

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

 Смежные вопросы

  • Нет связанных вопросов^_^