Прежде всего, раскомментирование этой строки создаст бесконечный цикл.cellForRowAt
происходит потому, что представление коллекции перезагружается, поэтому вызывать обновление во время обновления представления коллекции нецелесообразно.
Поэтому ваша проблема в том, что вы не знаете, как отображать выбранные ячейки в представлении коллекции., верно?
Вот функция, которая запускается непосредственно перед тем, как представление коллекции собирается отобразить ячейку:
func collectionView(_ collectionView: UICollectionView,
willDisplay cell: UICollectionViewCell,
forItemAt indexPath: IndexPath)
{
<#code#>
}
Внутри этой функции вы должны:
- Приведите
cell
в вашу OLLCell
(безопасно, если вы хотите быть тщательным) - Посмотрите на свои данные и посмотрите, должна ли быть выбрана ячейка
OLLData.OLLCasesList[indexPath.item]._isSelected
- Спросите у вашей приведенной ячейкиизменить его цвет / интерфейс / внешний вид в соответствии с вашим
._isSelected
логическим
Шаг 3 имеет ОЧЕНЬ важное предупреждение.Вы должны изменить пользовательский интерфейс, когда ._isSelected
ложно И когда это правда.Поскольку представление коллекции повторно использует ячейки, старое состояние пользовательского интерфейса будет случайным образом повторяться.Поэтому установка его каждый раз является хорошим способом обеспечить желаемое поведение.
Вот пример:
func collectionView(_ collectionView: UICollectionView,
willDisplay cell: UICollectionViewCell,
forItemAt indexPath: IndexPath)
{
//Cast the vanilla cell into your custom cell so you have access
//to OLLCell's specific functions and properties.
//Also make sure the indexPath falls in the indices of your data
if let myCastedCell = cell as? OLLCell,
0 ..< OLLData.OLLCasesList.count ~= indexPath.item
{
myCastedCell.imageView.backgroundColor = OLLData
.OLLCasesList[indexPath.item]._isSelected
? UIColor.orange
: UIColor.clear
}
}