动态 Table 查看单元格和 IBOutlets - 以编程方式在单元格内部的步进器上保存数据

Dynamic Table View Cells and IBOutlets - Saving Data on From Stepper Inside Cell Programmatically

我有一个包含多种不同类型单元格的动态 tableView。

在这些不同的类型中,我有一种类型的单元格正在使用,它会收集 2 个不同的数据点,我试图使用相同的 tableViewCell class 使用 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

但是我不确定在按下步进器时更改值时如何更新值。

基本思想是你的视图控制器应该告诉单元格它在 cellForRowAt 中的初始值是什么,并且单元格应该通知视图控制器更改(以便视图控制器可以更新模型),例如通过委托协议模式:

所以考虑这个模型结构:

struct DamperGas {
    let name: String
    var value: Double
}

以及在cellForRowAt中调用cell的configure方法的view controller,同时也符合cell的委托协议来接收更新:

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)"
    }
}

在此模式中,单元格不包含任何模型对象,而只是接受初始值的输入并将更新发送到其委托,即视图控制器。