Я пытаюсь добавить действие по выбору нескольких ячеек представления коллекции и изменению цвета фона при выборе ячейки. Я также хотел бы изменить цвет фона на исходный цвет, когда ячейка отменяется. Однако он работает, когда я прокручиваю представление коллекции, ячейки с измененным цветом фона исчезают. Я подозреваю, что мне может понадобиться отслеживать indexPath.row и сохранять его в массив, однако я не уверен, как правильно это реализовать.
var indexArray = [Int]()
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ShoeCell", for: indexPath) as! ShoeSizesCell
cell.backgroundColor = UIColor.textFieldBackgroundColorGray
cell.shoeSize.textColor = UIColor.init(hexString: "#737373")
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// indexArray.append(indexPath.row)
if let currentCell = collectionView.cellForItem(at: indexPath) as? ShoeSizesCell {
if currentCell.backgroundColor == UIColor.textFieldBackgroundColorGray {
currentCell.backgroundColor = .primaryColor
currentCell.shoeSize.textColor = .white
}
else if currentCell.backgroundColor == .primaryColor {
currentCell.backgroundColor = UIColor.textFieldBackgroundColorGray
currentCell.shoeSize.textColor = UIColor.init(hexString: "#737373")
}
}
}
Поскольку вы показываете некоторые данные в ячейке, вы можете создать для них модель.
struct Shoe {
let size: String
var isSelected: Bool
}
В ShoeSizesCell
добавьте переменную типа Shoe
. И переопределите свойство isSelected
UICollectionViewCell
class ShoeSizesCell: UICollectionViewCell {
var shoe: Shoe? {
didSet {
guard let shoe = shoe else { return }
self.shoeSize?.text = shoe.size
if shoe.isSelected {
self.backgroundColor = .primaryColor
self.shoeSize.textColor = .white
}
else {
self.backgroundColor = UIColor.textFieldBackgroundColorGray
self.shoeSize.textColor = UIColor.init(hexString: "#737373")
}
}
}
override var isSelected: Bool {
didSet {
if self.isSelected {
self.backgroundColor = .primaryColor
self.shoeSize.textColor = .white
}
else {
self.backgroundColor = UIColor.textFieldBackgroundColorGray
self.shoeSize.textColor = UIColor.init(hexString: "#737373")
}
}
}
}
В UIViewController
создайте массив типа Shoe
, который содержит данные ячеек. Вы можете назначить данные методом viewDidLoad()
.
var shoes = [Shoe]()
Установите allowsSelection
и allowsMultipleSelection
свойства UICollectionView
на true
.
collectionView.allowsSelection = true
collectionView.allowsMultipleSelection = true
В методе cellForItem
передайте данные Shoe
в ячейку.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ShoeSizesCell", for: indexPath) as? ShoeSizesCell {
cell.shoe = shoes[indexPath.item]
return cell
}
return UICollectionViewCell()
}
Измените метод didSelectItem, как показано ниже.
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
shoes[indexPath.item].isSelected = true
}
И переопределить метод didDeselectItemAt
.
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
shoes[indexPath.item].isSelected = false
}
// indexArray.append(indexPath.row)
, вы не можете добавить переменную Int в массив, вместо этого вы должны преобразовать ее, например.indexPath.row
, в число.