在swift中更新标签中的滑块值

时间:2017-06-21 06:40:43

标签: swift

我有一个带标签的滑块视图。我需要在滑块移动时更新标签值。滑块正在工作,我可以在日志中获取滑块值。但标签值只有在重新加载表视图或相应的单元格时才会更新。这会导致闪烁的影响。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
{
    rangeSlider.backgroundColor = UIColor.clear
    cell.addSubview(rangeSlider)
    rangeSlider.tag = indexPath.row
    rangeSlider.addTarget(self, action: #selector(PresentedViewController.rangeSliderValueChanged), for: .valueChanged)
    NotificationCenter.default.addObserver(self, selector: #selector(showSliderValue), name: NSNotification.Name(rawValue: "slidervalue"), object: nil)

    {
        cell.currentMaximumValue.text = self.upperSliderText
        cell.currentMinimumValue.text = self.LowerSliderText
    }
    else{
        let b:String = String(format:"%f", appDelegate.priceslidermaximumValue)
        let c:String = String(format:"%f", appDelegate.pricesliderminimumValue)
        cell.currentMaximumValue.text = b
        cell.currentMinimumValue.text = c
    }

    return cell
}

2 个答案:

答案 0 :(得分:0)

您需要在代码中更改一些内容。

首先,在cellForRowAt方法中,如果按dequeueReusableCell获取单元格对象,则在执行addSubview操作时需要小心。因此,您的单元格对象只是一个可重复使用的单元格,可能已经有一个滑块。如果在添加子视图之前未清除所有视图,则在向上和向下滚动一段时间后,您的单元格将充满滑块并可能会崩溃。我建议您在故事板的自定义表格视图单元格中添加此滑块。

其次,请勿使用NotificationCenter.default.addObserver。由于为每个准备显示的单元格调用cellForRow,因此您将多次添加观察者。

所以答案是

创建一个数组来存储每个单元格的滑块值

var sliderValues = [10, 20, 30, 40]

cellForRow中,只需添加听众

即可
cell.textField.text = sliderValues[indexPath.row]
cell.slider.tag = indexPath.row // Use tag to see which cell your slider is located
cell.slider.addTarget(self, action: #selector(sliderValueChanged), for: UIControlEvents.valueChanged)

然后在你的函数中使用监听器

func sliderValueChanged(sender: UISlider){
    sliderValues[sender.tag] = sender.value
    self.tableView.reloadData()
}

答案 1 :(得分:0)

感谢您的回复。 为了解决重新加载单元格时的闪烁效应,我使用了以下行。

printTypeNames<T>(obj: T) {
    const objectKeys = Object.keys(obj) as Array<keyof T>;
    for (let key of objectKeys)
    {
       console.Log('key:' + key);
    }
}

它对我有用。