动态 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)"
}
}
在此模式中,单元格不包含任何模型对象,而只是接受初始值的输入并将更新发送到其委托,即视图控制器。
我有一个包含多种不同类型单元格的动态 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)"
}
}
在此模式中,单元格不包含任何模型对象,而只是接受初始值的输入并将更新发送到其委托,即视图控制器。