Основная идея c заключается в том, что ваш контроллер представления должен сообщить ячейке, в каком начальном значении находится cellForRowAt
, а ячейка должна информировать контроллер представления об изменениях (чтобы контроллер представления мог обновить модель), например, как с помощью шаблона протокола делегата:
Итак, рассмотрим структуру этой модели:
struct DamperGas {
let name: String
var value: Double
}
И контроллер представления, который вызывает метод configure
ячейки в cellForRowAt
, но также соответствует протокол делегата ячейки для получения обновлений:
class ViewController: UITableViewController {
private var values: [DamperGas] = ...
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return values.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "DamperGasTableViewCell", for: indexPath) as! DamperGasTableViewCell
cell.configure(with: values[indexPath.row], delegate: self)
return cell
}
}
extension ViewController: DamperGasTableViewCellDelegate {
func stepperCell(_ cell: DamperGasTableViewCell, didChangeValue value: Double) {
guard let indexPath = tableView.indexPath(for: cell) else { return }
values[indexPath.row].value = value
}
}
И ячейка будет определять протокол и затем вызывать делегат при изменении степпера:
protocol DamperGasTableViewCellDelegate: class {
func stepperCell(_ cell: DamperGasTableViewCell, didChangeValue value: Double)
}
class DamperGasTableViewCell: UITableViewCell {
@IBOutlet weak var damperGasLabel: UILabel!
@IBOutlet weak var valueLabel: UILabel!
@IBOutlet weak var stepper: UIStepper!
weak var delegate: DamperGasTableViewCellDelegate?
func configure(with entry: DamperGas, delegate: DamperGasTableViewCellDelegate) {
self.delegate = delegate
damperGasLabel.text = entry.name
stepper.value = entry.value
updateLabel()
}
@IBAction func valueChanged(_ sender: UIStepper) {
updateLabel()
delegate?.stepperCell(self, didChangeValue: sender.value)
}
}
private extension DamperGasTableViewCell {
func updateLabel() {
valueLabel.text = "\(stepper.value)"
}
}
В этом шаблоне ячейка не не содержит никаких объектов модели, а просто принимает входные данные для начальных значений и отправляет обновления своему делегату, контроллеру представления.