滚动后重用单元格后,如何维护 table 视图单元格中的值?
how to maintain the value in table view cell after the cell is reused after scrolling?
这是我的问题的 .gif:http://g.recordit.co/LnslGAaWwK.gif
起初,我可以使用递增或递减按钮来增加或减少值。但是在将 table 视图滚动到底部然后回到我之前更改的步进器之后,似乎 减量按钮 不起作用,计数器标签的值仍然存在保持不变
但是,如果我点击 递增按钮 ,它可以工作,但仍然给出错误的值,它将重新从 1 开始,它不会在滚动之前继续该值.
我怀疑问题出在这里(完整代码如下):
override func awakeFromNib() {
super.awakeFromNib()
setStepper()
}
滚动到table视图底部后,awakeFromNib()
中的setStepper()
似乎会再次触发,这意味着步进器的初始值(stepper.value = 0)
, 将再次回到零,这也许就是为什么如果我按下增量按钮,它会给出 1,而不是在滚动之前继续该值
这是我的 table 视图单元格中的代码
import UIKit
import KWStepper
protocol CounterDelegate{
func incrementOrDecrementButtonDidTapped(at selectedIndexPath:IndexPath, counterValue: Int)
}
class CheckOutCell: UITableViewCell {
var stepper: KWStepper?
var indexPath: IndexPath?
var delegate: CounterDelegate?
@IBOutlet weak var counterLabel: UILabel!
@IBOutlet weak var decrementButton: UIButton!
@IBOutlet weak var incrementButton: UIButton!
var productData : Product? {
didSet {
updateUI()
}
}
override func awakeFromNib() {
super.awakeFromNib()
setStepper()
}
func setStepper() {
stepper = KWStepper(decrementButton: decrementButton, incrementButton: incrementButton)
guard let stepper = stepper else {return}
stepper.autoRepeat = false
stepper.wraps = false
stepper.minimumValue = 0
stepper.value = 0
stepper.incrementStepValue = 1
stepper.decrementStepValue = 1
stepper.valueChangedCallback = { stepper in
let stepperValue = Int(stepper.value)
// send data to CheckoutVC
guard let indexPath = self.indexPath else {return}
self.delegate?.incrementOrDecrementButtonDidTapped(at: indexPath, counterValue: stepperValue)
print(stepperValue)
}
}
func updateUI() {
guard let productData = productData else {return}
counterLabel.text = "\(productData.quantity)"
}
}
那么如何解决这个问题呢?如何在我将 table 视图滚动到底部后继续显示值?
你需要重新考虑你的策略。
TableView 只是其数据源中数据的可视化表示,一次只能显示数据源的一部分。
因此 TableViewCell 显示的数据应该存储在数据源中,而不是单元格中。
在数组中组织数据,让 TableViews 数据源指向该数组。您需要实现 UITableViewDatasource 协议的方法 (numberOfSections
, numberOfRowsInSection
).
然后,覆盖 cellForRowAtIndexPath
,其中使用来自索引 indexPath.row
处的数据源数组的数据设置单元格。
然后应在数据源中对步进器所做的更改。
希望你明白了。
这是我的问题的 .gif:http://g.recordit.co/LnslGAaWwK.gif
起初,我可以使用递增或递减按钮来增加或减少值。但是在将 table 视图滚动到底部然后回到我之前更改的步进器之后,似乎 减量按钮 不起作用,计数器标签的值仍然存在保持不变
但是,如果我点击 递增按钮 ,它可以工作,但仍然给出错误的值,它将重新从 1 开始,它不会在滚动之前继续该值.
我怀疑问题出在这里(完整代码如下):
override func awakeFromNib() {
super.awakeFromNib()
setStepper()
}
滚动到table视图底部后,awakeFromNib()
中的setStepper()
似乎会再次触发,这意味着步进器的初始值(stepper.value = 0)
, 将再次回到零,这也许就是为什么如果我按下增量按钮,它会给出 1,而不是在滚动之前继续该值
这是我的 table 视图单元格中的代码
import UIKit
import KWStepper
protocol CounterDelegate{
func incrementOrDecrementButtonDidTapped(at selectedIndexPath:IndexPath, counterValue: Int)
}
class CheckOutCell: UITableViewCell {
var stepper: KWStepper?
var indexPath: IndexPath?
var delegate: CounterDelegate?
@IBOutlet weak var counterLabel: UILabel!
@IBOutlet weak var decrementButton: UIButton!
@IBOutlet weak var incrementButton: UIButton!
var productData : Product? {
didSet {
updateUI()
}
}
override func awakeFromNib() {
super.awakeFromNib()
setStepper()
}
func setStepper() {
stepper = KWStepper(decrementButton: decrementButton, incrementButton: incrementButton)
guard let stepper = stepper else {return}
stepper.autoRepeat = false
stepper.wraps = false
stepper.minimumValue = 0
stepper.value = 0
stepper.incrementStepValue = 1
stepper.decrementStepValue = 1
stepper.valueChangedCallback = { stepper in
let stepperValue = Int(stepper.value)
// send data to CheckoutVC
guard let indexPath = self.indexPath else {return}
self.delegate?.incrementOrDecrementButtonDidTapped(at: indexPath, counterValue: stepperValue)
print(stepperValue)
}
}
func updateUI() {
guard let productData = productData else {return}
counterLabel.text = "\(productData.quantity)"
}
}
那么如何解决这个问题呢?如何在我将 table 视图滚动到底部后继续显示值?
你需要重新考虑你的策略。
TableView 只是其数据源中数据的可视化表示,一次只能显示数据源的一部分。
因此 TableViewCell 显示的数据应该存储在数据源中,而不是单元格中。
在数组中组织数据,让 TableViews 数据源指向该数组。您需要实现 UITableViewDatasource 协议的方法 (numberOfSections
, numberOfRowsInSection
).
然后,覆盖 cellForRowAtIndexPath
,其中使用来自索引 indexPath.row
处的数据源数组的数据设置单元格。
然后应在数据源中对步进器所做的更改。
希望你明白了。