Swift:如何在动态UITableView中获取自定义单元格中滑块的值?

时间:2016-02-03 11:42:05

标签: swift uitableview uislider

我遇到以下情况的问题:

我有一个动态单元格UITableView。其中,我使用自定义UITableViewCellUISlider。如何获取滑块的值?

我创建了以下示例:(项目文件可以在此处下载:Link

SliderClass.swift

import UIKit

class SliderClass: NSObject {
    var title: String
    var subtitle: String
    var sliderMinimum: Float
    var sliderMaximum: Float

    init(title: String, subtitle: String, sliderMinimum: Float, sliderMaximum: Float) {
        self.title = title
        self.subtitle = subtitle
        self.sliderMinimum = sliderMinimum
        self.sliderMaximum = sliderMaximum

    }
}

SliderTableViewCell.swift

import UIKit

class SliderTableViewCell: UITableViewCell {

    @IBOutlet weak var cellTextLabel: UILabel!
    @IBOutlet weak var cellDetailTextLabel: UILabel!
    @IBOutlet weak var cellSlider: UISlider!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

TableViewController.swift

import UIKit

class TableViewController: UITableViewController {

    var slider: [SliderClass] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Slider"

        let slider1 = SliderClass(title: "Title1", subtitle: "Subtitle1", sliderMinimum: 0, sliderMaximum: 100)
        let slider2 = SliderClass(title: "Title2", subtitle: "Subtitle2", sliderMinimum: 0, sliderMaximum: 200)

        slider = [slider1, slider2]
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return slider.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("sliderCell", forIndexPath: indexPath) as! SliderTableViewCell

        let slider: SliderClass
        slider = self.slider[indexPath.row]

        cell.cellTextLabel.text = slider.title
        cell.cellDetailTextLabel?.text = slider.subtitle
        cell.cellSlider.minimumValue = slider.sliderMinimum
        cell.cellSlider.maximumValue = slider.sliderMaximum

        return cell
    }

    func sliderValueChange() {
     // I need help here:
     // Which slider changed to which value?

     // var slider = ...
     // var sliderValue = ...
     // NSLog("Value of slider:%@ changed to:%i", slider, sliderValue)
    }
}

以下是使用上述代码创建的UITableView的屏幕截图。 Screenshot

3 个答案:

答案 0 :(得分:6)

尝试将此添加到您的cellForRowAtIndexPath功能:

cell.cellSlider.tag = indexPath.row
cell.cellSlider.addTarget(self, action: "sliderValueChange:", forControlEvents: .ValueChanged)

然后在表函数之外添加如下内容:

func sliderValueChange(sender: UISlider) {
    // Get the sliders value
    var currentValue = Int(sender.value)
    var sliderRow = sender.tag

    // Do whatever you want with the value :)
    // And now the row of the slider!
}

确保cellSlider目标的操作名称与该功能的名称相同!因为这需要一个论点,所以最后不要忘记结肠。

总而言之,这里只是上述行动的一个例子:

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2    // 2 rows in the cell, for demo purposes
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell

        cell.slider.tag = indexPath.row
        cell.slider.addTarget(self, action: "sliderChange:", forControlEvents: .ValueChanged)

        return UITableViewCell()
    }

    func sliderChange(sender: UISlider) {
        let currentValue = sender.value    // get slider's value
        let row = sender.tag               // get slider's row in table

        print("Slider in row \(row) has a value of \(currentValue)")
        // example output - Slider in row 1 has a value of 0.601399
    }

}

class TableViewCell: UITableViewCell {

    @IBOutlet var slider: UISlider!

}

答案 1 :(得分:0)

获取自定义单元格中滑块的值。

希望这对您有所帮助,请在Swift中查看GitHub代码并参考屏幕截图

https://github.com/appcoda/expandable-table-view

enter image description here

答案 2 :(得分:0)

另一种选择是使用ASValueTrackingSlider。请注意,这是用ObjectiveC写的。