在 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 中的自定义单元格将无法正确重新加载

自定义 UITableView 单元格中的 UILabel 未随核心数据更改而更新

实现 UITableView (Slave) 的动态高度,它作为子视图添加到另一个具有动态高度的 UITableView (Master) 的自定义单元格中