UISlider没有更新Swift中的当前值

时间:2015-08-11 21:45:12

标签: ios swift uilabel uislider

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

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)

 }

4 个答案:

答案 0 :(得分:5)

你可以使用一些技巧来做到这一点,首先你需要像建议的那样设置UISlider的目标,另一点是获得所选行,你可以实现保存以下代码中tag的{​​{1}}属性:

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就像在这个问题Find UILabel in UIView in Swift中提出的方法一样,因为数字可以改变。

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

我希望这对你有所帮助。

答案 1 :(得分:2)

通常你应该在滑块上添加一个动作:

import UIKit
import GLKit
import XCPlayground

class RGView: GLKView {
    override func drawRect(rect: CGRect) {
        glClearColor(0.0, 0.0, 1.0, 1.0)
        glClear(GLbitfield(GL_COLOR_BUFFER_BIT))
    }
}

let view = RGView(frame: CGRectMake(0, 0, 200, 200), context: EAGLContext(API: .OpenGLES2))
view.setNeedsDisplay()

// tried with and without this
XCPShowView("RGView", view)

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

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

**我的推荐:使用storyBoard然后轻松设计你的视图并使用自定义的TableViewCell类。

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

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

在cellForRowAtIndexPath函数中添加:

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

OR

您可以执行其他人提到的内容并创建自定义IBOutlets,添加滑块和标签,并为其创建shinyServer(function(input, output) { # After the Submit button is clicked init <- reactiveValues() observe({ if(input$submit > 0) { init$pasted <- isolate(paste("Your personality type is ", input$b1, input$b2, input$b3, input$b4, sep="")) init$link <- paste("https://en.wikipedia.org/wiki/", input$b1, input$b2, input$b3, input$b4, sep="") init$linktext <- a("Find out more about it here", href=init$link, target="_blank") } }) # Output output$text1 <- renderText({ init$pasted }) output$text2 <- renderText({ init$linktext })