Ячейки Dynami c Table View и IBOutlets - программное сохранение данных из ячейки Stepper - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть динамическое c tableView с несколькими разными типами ячеек.

Из этих разных типов у меня есть один тип ячеек, который я использую, который будет собирать 2 разные точки данных. пытаюсь захватить с помощью того же класса tableViewCell, используя UIStepper.

код:

class DamperGasTableViewCell: UITableViewCell {

    @IBOutlet weak var damperGasLabel: UILabel!
    @IBOutlet weak var valueLabel: UILabel!

    @IBOutlet weak var valueStepper: UIStepper!

    var valueDouble: Double = 0.0

    override func awakeFromNib() {
        super.awakeFromNib()

        setValueLabel()
    }

    func setValueLabel () {

        valueLabel.text = String(valueDouble)
    }


    @IBAction func valueChanged(_ sender: Any) {

        valueDouble = Double(valueStepper.value)
        setValueLabel()
    }
}

Что я пытаюсь сделать, это выяснить, как получить значение степпера ( valueDouble) внутри контроллера представления, чтобы я мог установить для него другую переменную.

Я могу получить значение изначально при загрузке, выполнив:

cellForRowAt - 
cell.valueDouble = self.valueCell

Но Я не уверен, как go обновлять значение при изменении значения при нажатии на шаговый механизм.

1 Ответ

0 голосов
/ 16 апреля 2020

Основная идея 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)"
    }
}

В этом шаблоне ячейка не не содержит никаких объектов модели, а просто принимает входные данные для начальных значений и отправляет обновления своему делегату, контроллеру представления.

...