【问题标题】:Using slider in custom cell of a UITableView在 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的代码会帮助你。

标签: ios swift uitableview uislider


【解决方案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 调用时都必须重新加载此值,因为表格单元格是重复使用的,它存储旧值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多