#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, и когда я регистрирую щелчок здесь, я не могу получить доступ к пути индекса ячейки, на которую был нажат. Поэтому, когда ячейки создаются заново, я не могу указать коду, какой ячейке придать определенный цвет, поскольку я не знаю путь к индексу. Имеет ли это смысл? Или я делаю неправильно…