Как сохранить состояние ячейки, чтобы при прокрутке или выходе из страницы она не обновляла ячейки? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь создать магазин для игры, в котором можно купить шары разных цветов. Для начала я использую UICollectionView со всеми белыми шарами. Когда я щелкаю ячейку, изображение белого шара изменяется на изображение цветного шара (РЕДАКТИРОВАТЬ: изображение из предварительно созданного массива цветных изображений). когда я прокручиваю вниз и возвращаюсь назад, выбранные ячейки сбрасываются в изображение белого шара. Я не хочу этого, очевидно.

Я пытался использовать метод, уже встроенный в класс UICollectionView, с помощью didSelectItemAt, но когда я прокручиваю вниз и назад, все становится не так (когда я выбираю ячейку, изображение другой меняется не на ту, которую нужно). Я пытался использовать isSelected в классе collectionViewCell, но я не могу указать здесь путь к индексу, поэтому не могу сохранить выбранные ячейки.

override var isSelected: Bool{
    didSet{
        if self.isSelected
        {
            textImage.image = images[indexPath.item]    // I don't know what to put here I don't have the indexPath

        }
        else
        {
            textImage.image = #imageLiteral(resourceName: "circleWhite")

        }
    }
}

Любая помощь - это здорово, я довольно новичок в кодировании в Xcode, поэтому некоторые объяснения того, что здесь делать, очень ценятся.

РЕДАКТИРОВАТЬ: у меня есть массив изображений, которые должны храниться, а не только один другой цвет, несколько цветов. Когда я нажимаю на ячейку, она должна получить доступ к изображению в соответствующем индексе в массиве и использовать это изображение для замены белого круга.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Сделали то же самое в нашем коде. Ниже приведено решение для этого.

1.Введите массив кортежей, чтобы поддерживать выбранный статус и определенные цвета или все, что вы хотите.

var arrColor = [(isSelected:Bool,color:UIColor)]()

2.Теперь выполните приведенный ниже код для cellForItemAt. * ​​1006 *

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    guard let collectionViewCell = self.iconCollectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as? EditDeviceCollectionViewCell else { return UICollectionViewCell() }

    if arrColor[indexPath.item].isSelected{
        arrColor[indexPath.item].color = .white
    }else {
        arrColor[indexPath.item].color = .black
    }

    return  collectionViewCell
}

3. Теперь напишите метод источника данных и используйте ниже для цвета

//MARK:- UICollectionViewDelegate

расширение yourViewController: UICollectionViewDelegate {

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    arrColor[indexPath.item].isSelected = true

}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
    arrColor[indexPath.item].isSelected = false.
}

}

Happy Coding 101

0 голосов
/ 23 апреля 2019

Когда вы прокручиваете экран, ячейки получают метод prepareForReuse для них.Что вам нужно сделать, это сохранить состояние цвета в другом месте - например, в collectionView или viewModel.И когда вызывается cellForRow, вы извлекаете цвет для отображения этой строки из сохраненной переменной состояния.

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

...