Как сохранить статус ячейки, чтобы при прокрутке или выходе со страницы ячейки не обновлялись?

#ios #swift #xcode #uicollectionview #uicollectionviewcell

#iOS #swift #xcode #uicollectionview #uicollectionviewcell

Вопрос:

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

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

 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, поэтому некоторые объяснения того, что здесь делать, очень ценятся.

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

Комментарии:

1. Вы могли бы настроить базовый массив и перерисовать его по мере необходимости.

2. джесси — это то, что я пытаюсь сделать, но я не могу настроить массив, не зная, на какой indexPath я нажал. Я настраиваю массив в своем классе UICollectionView, но когда в классе UICollectionViewCell я не могу получить доступ к определенному индексу массива без indexPath

3. можете ли вы использовать didselectItemAtPath (который даст вам индекс выбранного) и, возможно, вы можете что-то сделать с этим значением индекса (сохранить его)?

Ответ №1:

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

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

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

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

 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.
}
  

}

Счастливого кодирования 😊

Комментарии:

1. Я отредактировал свой вопрос, чтобы дать немного больше разъяснений. Я не хочу, чтобы он просто менялся на оранжевый, я хочу, чтобы он менялся на определенный цвет в массиве. Как только я смогу это сделать, я смогу просто получить доступ к этому месту в массиве при переделке ячейки при ее прокрутке. Извините за путаницу.

2. Спасибо за помощь!! В итоге я сделал это немного по-другому, но предоставленная вами информация определенно помогла!

Ответ №2:

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

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

Комментарии:

1. Я пытаюсь сохранить состояние цвета в другом месте, однако сначала все они белые. Затем при нажатии кнопки on она меняется на другое изображение, цвет. При том, как я делаю это сейчас, у меня есть способ проверить, нажата ли ячейка в классе UICollectionViewCell, и когда я регистрирую щелчок здесь, я не могу получить доступ к пути индекса ячейки, на которую был нажат. Поэтому, когда ячейки создаются заново, я не могу указать коду, какой ячейке придать определенный цвет, поскольку я не знаю путь к индексу. Имеет ли это смысл? Или я делаю неправильно…