【问题标题】:UISlider not updating current value in SwiftUISlider 不更新 Swift 中的当前值
【发布时间】:2015-11-04 07:28:57
【问题描述】:

我在表格视图单元格中有一个滑块,我正在尝试将标签的文本设置为滑块的值。但是,文本未设置为更改后的滑块值。我做错了什么?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = UITableViewCell()

    if indexPath.section == 0 {

        let slider = UISlider(frame: CGRectMake(0, 0, 320, 44))
        slider.userInteractionEnabled = true
        slider.minimumValue = 1
        slider.maximumValue = 100
        slider.value = 50
        slider.continuous = true
        cell.addSubview(slider)
        println(cell.bounds)

        let label = UILabel(frame: CGRectMake(260, -20, 100, 20))
        var theValue = Int(slider.value)
        label.text = "\(theValue)" + "mi."
        cell.addSubview(label)
 }

【问题讨论】:

  • 您在cellForRowAtIndexPath 中设置当前值,但它没有得到更新,因为您没有为滑块实现valueChanged
  • 我是否使用调用 valueChanged 函数的 addTarget 来做到这一点?
  • 是的,但您还需要访问标签。有几种方法可以实现这一目标。

标签: ios swift uilabel uislider


【解决方案1】:

您可以使用一些技巧来做到这一点,首先您需要按照建议设置UISlider的目标,另一点是获取选定的行,您可以将其保存在@ 987654323@ 属性indexPath.row 如下代码所示:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

    let slider = UISlider(frame: CGRectMake(0, 0, 100, 44))
    slider.userInteractionEnabled = true
    slider.minimumValue = 1
    slider.maximumValue = 100
    slider.value = 50
    slider.continuous = true

    // set the target to respond to changes.
    slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: UIControlEvents.ValueChanged)

    // save the indexPath.row
    slider.tag = indexPath.row
    cell.addSubview(slider)


    let label = UILabel(frame: CGRectMake(105, 0, 100, 20))
    var theValue = Int(slider.value)
    label.text = "\(theValue)" + "mi."
    cell.addSubview(label)

    return cell
}

另一个问题是设置 UILabel 文本,您可以通过获取单元格内的确切视图来实现,如下代码所示:

func sliderValueChanged(sender: AnyObject) {

    var slider = sender as! UISlider
    let cell = self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: slider.tag, inSection: 0)) as UITableViewCell!

    // If you know the exactly index
    // var label = cell.subviews[4] as! UILabel
    // label.text = "\(slider.value)"

    // assuming you have only one `UILabel` inside your cell
    for view in cell.subviews {
        if let label = view as? UILabel {
            label.text = "\(slider.value)"
        }
    }
}

在上面的代码中,我只在UITableViewCell 中设置了确切的数字,以显示方式,但强烈推荐的方法是遍历所有UIView 并找到你的UILabel,就像在中提出的方法中一样这个问题Find UILabel in UIView in Swift 因为数字可以改变。

正如一些人之前所说,通过 Interface Builder 设置自定义单元更容易,但这取决于你。

希望对你有所帮助。

【讨论】:

  • 这是在 TableView 控制器中吗?我正在使用添加了表视图的视图控制器。你有什么建议?我总共有 3 个部分。
  • 是的,不过没关系,您可以将@IBOutlet 设置为您的UITableView 并据此更改名称。
  • 嗯,我收到以下错误:“_UITableViewCellSeparatorView”(0x199842680)到“UILabel”(0x19983fe30)。有什么想法吗?
  • 是的,当然,正如我之前在回答中所说,我根据我的UITableViewCell设置了号码,但是您需要按照我在回答中所说的找到它或者只是设置号码,查看更新解答疑虑。
【解决方案2】:

通常你应该给你的滑块添加一个动作:

slider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged)

func sliderValueDidChange(sender:UISlider!)
{
    println("value--\(sender.value)")
}

如此处所述:http://www.apptuitions.com/programmatically-creating-uiview-uislider-uiswitch-using-swift/

** 由于您需要在任何单元格中单独更改标签和使用滑块的值,因此您必须使用自定义 TableViewCell 类并在其中轻松定义滑块、标签和操作。

** 我的建议:使用 storyBoard,然后轻松设计您的视图并使用自定义的 TableViewCell 类。

为您提供一个示例表格视图单元格类(类似于我自己项目中的一个):

class CustomCell: UITableViewCell {

    @IBOutlet weak var slider: UISlider!
    @IBOutlet weak var label: UILabel!

    @IBAction func sliderChanged(sender: AnyObject) {
    // set label text to slider.value here
    }

}

【讨论】:

  • 我想使用 StoryBoard,但我需要在表格视图中的部分之间留出间距。这在 StoryBoard 中可行吗?
  • 你只需要重写 UITableViewDataSource 函数。这是你需要的:stackoverflow.com/questions/30364067/…
【解决方案3】:

您缺少滑块拖动操作。 slider.addTarget(self, action: "sliderValueDidChange", forControlEvents: .ValueChanged)

func sliderValueDidChange(sender:UISlider!){
    println("value--\(sender.value)")
    label.text = String(sender.value)
}

您可以使用slider.superview或在滑块的标签中存储索引,以获取对滑块所属单元格的引用并访问标签。

更好的解决方案是为单元格创建自定义类。

【讨论】:

    【解决方案4】:

    在你的 cellForRowAtIndexPath 函数中添加这个:

    slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: .ValueChanged)
    label.tag = 1
    

    您可以使用它来更新标签:

    func sliderValueChanged(sender: AnyObject)
    {
        var position: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
        if let indexPath = self.tableView.indexPathForRowAtPoint(position) {
            //get your cell here
            let cell = tableView.cellForRowAtIndexPath(indexPath)
            //update label
            for view in cell.subviews {
               if let label = view as? UILabel {
                  if label.tag == 1 {
                     label.text! = "\((sender as! UISlider).value)"
                  }
               } 
            }
        }
    }
    

    您可以按照其他人提到的方式创建自定义UITableViewCell,添加滑块和标签,然后为他们创建IBOutlets

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      相关资源
      最近更新 更多