Сохранение данных из обновлений ячейки uicollectionview - PullRequest
0 голосов
/ 24 января 2019

У меня есть представление коллекции, сгенерированное из массива пользовательских объектов, где каждая ячейка представляет счетчик со значением, которое можно обновить с помощью кнопок "+" и "-".

Когда я обновляю это значение с помощью кнопок, оно изменяется визуально, но не сохраняется в массиве, поэтому при перезапуске приложения у меня появляется старшее количество, которое раньше менялось с помощью кнопок

var data: [CounterModel] = []

это мой массив в моем ViewController.swift

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CounterCell", for: indexPath) as! CounterCell
    cell.configure(with: data[indexPath.row])

    return cell
  }

здесь я настраиваю свою ячейку

 public func configure(with model: CounterModel) {
    nameLabel.text = model.name
    amountLabel.text = String(model.amount)
  }

  @IBAction func lessBtnTapped(_ sender: Any) {
    newAmount = Int(amountLabel.text!)

    if (newAmount == 0) {
      amountLabel.text = "\(newAmount!)"
    } else {
      amountLabel.text = "\(newAmount! - 1)"
    }
  }


  @IBAction func moreBtnTapped(_ sender: Any) {
    newAmount = Int(amountLabel.text!)

    amountLabel.text = "\(newAmount! + 1)"
  }

здесь я настраиваю свою ячейку и выполняю изменения значения (в CounterCell.swift)

struct CounterModel: Codable {
  var name: String
  var amount: Int
}

это моя CounterModel

РЕДАКТИРОВАТЬ (с отсутствующей информацией)

Я кодирую свои счетчики в Json и сохраняю их по умолчанию:

func saveUserDefaults(counters: [CounterModel]) {
  let defaults = UserDefaults.standard

  let jsonEncoder = JSONEncoder()
  let jsonData = try? jsonEncoder.encode(counters)

  defaults.set(jsonData, forKey: "savedCounters")
}

func loadUserDefaults() -> [CounterModel] {
  let defaults = UserDefaults.standard
  var savedCounters: [CounterModel] = []

  guard let jsonData = defaults.object(forKey: "savedCounters") as? Data else { return savedCounters}

  let jsonDecoder = JSONDecoder()
  savedCounters = try! jsonDecoder.decode([CounterModel].self, from: jsonData)

  return savedCounters

Я обновляю свои Userdefaults в AlertAction, когда создаю новый счетчик

let newCounter: CounterModel = CounterModel(name: self.newLabelValue!, amount: self.newAmountValue!)

      self.data.append(newCounter)
      saveUserDefaults(counters: self.data)

      self.data = loadUserDefaults()

      self.collectionView.reloadData()

1 Ответ

0 голосов
/ 24 января 2019

Вы должны обновить свою модель.Перенесите кран на контроллер представления с помощью замыкания и сделайте там логику.Быстрое решение может быть:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CounterCell", for: indexPath) as! CounterCell
    cell.configure(with: data[indexPath.row]) { newValue in
        self.data[indexPath.row].amount = newValue
        self.saveUserDefaults(counters: self.data)
    }

    return cell
}

Класс ячейки:

private var valueDidChange: ((Int) -> Void)?

public func configure(with model: CounterModel, valueDidChange: @escaping (Int) -> Void) {
    nameLabel.text = model.name
    amountLabel.text = String(model.amount)
    self.valueDidChange = valueDidChange
}

@IBAction func lessBtnTapped(_ sender: Any) {
    newAmount = Int(amountLabel.text!)

    if (newAmount == 0) {
      amountLabel.text = "\(newAmount!)"
    } else {
      amountLabel.text = "\(newAmount! - 1)"
    }
    valueDidChange?(newAmount)
}


@IBAction func moreBtnTapped(_ sender: Any) {
    newAmount = Int(amountLabel.text!)

    amountLabel.text = "\(newAmount! + 1)"
    valueDidChange?(newAmount)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...