Проблема:
Вы создали favoritesArray
внутри MediaCollectionViewCell
. Каждый раз, когда cell
используется повторно, favoritesArray
будет повторно инициализирован, т.е. добавленный ранее entity
будет потерян.
Вот почему вы всегда находите внутри него один entity
и тот же самый cell
.
Решение:
Вместо создания дополнительного favoritesArray
внутри ячейки, попробуйте использовать closure
, чтобы сохранить избранные объекты. Вот подход, которому вы можете следовать.
1. Прежде всего используйте class
вместо struct
и добавьте свойство isFavourite
внутри * Модель 1033 *, т.е.
class MediaObject: Codable {
let name: String
var results: [Entity]
}
class Entity: Codable {
var id: Int?
var name: String?
var kind: String?
var artwork: String?
var genre: String?
var artist: String?
var isFavourite = false
enum CodingKeys: String, CodingKey {
case id = "trackId"
case name = "trackName"
case kind = "kind"
case artwork = "artworkUrl100"
case genre = "primaryGenreName"
case artist = "artistName"
}
}
Примечание: Существует необходимость создания init(from:)
внутри модели Entity
. Используйте его, когда есть какая-то особая обработка.
2. Теперь внутри MediaCollectionViewCell
создайте closure
favouriteHandler
и вызывайте его внутри favButtonPressed(_:)
то есть
class MediaCollectionViewCell: UICollectionViewCell {
//rest of the code...
var favouriteHandler: (()->())?
@IBAction func favButtonPressed(_ sender: Any) {
print("isFavorited")
self.favouriteHandler?()
}
}
3. Далее, в collectionView(_:cellForItemAt:)
установите favouriteHandler
, чтобы обновить isFavourite
статус entity
, а затем сохраните все объекты с isFavourite = true
в UserDefaults
.
Используйте filter(_:)
, чтобы получить все избранные объекты.
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MediaCollectionViewCell
if let entity = obj?.results[indexPath.row] {
cell.entity = entity
cell.artistLabel.text = entity.artist
cell.trackLabel.text = entity.name
cell.favouriteHandler = {[weak self] in //here...
entity.isFavourite = !entity.isFavourite
let favourites = self?.obj?.results.filter{ $0.isFavourite }
let data = try? JSONEncoder().encode(favourites)
UserDefaults.standard.set(data, forKey: "entity")
}
}
return cell
}