在 UITableView 的自定义单元格中使用滑块
Posted
技术标签:
【中文标题】在 UITableView 的自定义单元格中使用滑块【英文标题】:Using slider in custom cell of a UITableView 【发布时间】:2016-09-17 10:10:26 【问题描述】:我有一个 UITableView,它有原型 cells
,其中包括一个滑块和旁边的 textfield
。随着滑块值的变化,textview
内的值也会发生变化。它工作正常,除了当表格大小增加时,向下滚动时生成的新cell
已经显示了第一个单元格的值。我确实意识到这与dequeueReusableCellWithIdentifier
函数有关,因为cells
被重用了。如何避免这种情况?
这是代码:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = self.tableView.dequeueReusableCellWithIdentifier("infoCell") as! InfoCell
cell.dressLabel.text = inputArrayFortableView[indexPath.row]
cell.uiSlider.maximumValue = 100
cell.uiSlider.minimumValue = 0
cell.uiSlider.continuous = true
cell.uiSlider.addTarget(cell, action: #selector(cell.uiSliderSetValue), forControlEvents: .ValueChanged)
if(cell.DressTextField.text != "")
cell.uiSlider.setValue(Float(cell.DressTextField.text!)!, animated: true)
print("outside uisliderSetvalue")
cell.uiSlider.tag = indexPath.row
print(cell.uiSlider.tag)
return cell
我附上截图。请记住,当我向下滚动时,新单元格的值与第一个单元格的值相同,生成的第二个单元格的值与第二个相同,依此类推。
【问题讨论】:
在不知不觉中显示cellForRowAtIndexPath
的代码会帮助你。
【参考方案1】:
由于单元格被重复使用,滑块将保留上次使用单元格时的值。确保始终在 cellForRowAtIndexPath
中初始化滑块:
if cell.DressTextField.text != ""
cell.uiSlider.setValue(Float(cell.DressTextField.text!)!, animated: true)
else
cell.uiSlider.setValue(0, animated: false)
【讨论】:
这样做的问题是,当我在更改值后向上滚动时,第一个滑块的值以及其他后续滑块的值也设置为 0 您不应该使用表格单元格来存储数据。移动滑块时,您应该将该值存储在独立于单元格的模型中。最简单的做法是拥有视图控制器的属性,该属性维护滑块值,例如数组,并在滑块更改时更新该数组中的值。此外,cellForRowAtIndexPath 将在设置单元格时从该数组中读取值。【参考方案2】:当值更改时,您必须将滑块的值存储到inputArrayFortableView
。每次func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
调用时都必须重新加载此值,因为表格单元格是重复使用的,它存储旧值。
【讨论】:
以上是关于在 UITableView 的自定义单元格中使用滑块的主要内容,如果未能解决你的问题,请参考以下文章
从多节 UITableView 中的自定义静态单元格中检索标签文本
UITableview 默认单元格中的自定义分隔符显示意外行为
更改单元格中的数据后,UITableView 中的自定义单元格将无法正确重新加载
自定义 UITableView 单元格中的 UILabel 未随核心数据更改而更新
实现 UITableView (Slave) 的动态高度,它作为子视图添加到另一个具有动态高度的 UITableView (Master) 的自定义单元格中