在UITableView的自定义单元格中使用滑块

时间:2016-09-17 10:10:26

标签: ios swift uitableview uislider

我有一个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

}

我附上截图。请记住,当我向下滚动时,新单元格与第一个单元格具有相同的值,生成的第二个单元格具有与第二个单元格相同的值,依此类推。

enter image description here

2 个答案:

答案 0 :(得分:0)

由于单元格被重用,滑块将保留上一次使用单元格时的值。确保始终初始化cellForRowAtIndexPath中的滑块:

if cell.DressTextField.text != ""
{
    cell.uiSlider.setValue(Float(cell.DressTextField.text!)!, animated: true)
} else {
    cell.uiSlider.setValue(0, animated: false)
}

答案 1 :(得分:0)

更改值时,您必须将滑块的值存储到inputArrayFortableView。每次func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell调用时都必须重新加载此值,因为表格单元格是重用的,它会存储旧值。