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

Posted

技术标签:

【中文标题】Swift:如何在动态 UITableView 的自定义单元格中获取滑块的值?【英文标题】:Swift: How to get the value of a slider in a custom cell in a dynamic UITableView? 【发布时间】:2016-02-03 11:42:05 【问题描述】:

我对以下场景有疑问:

我有一个带有动态单元格的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 的屏幕截图。

【问题讨论】:

【参考方案1】:

尝试将此添加到您的 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!


【讨论】:

@Benjamin1956 在cellForRowAtIndexPath 中添加了一行,将滑块的标签设置为它所在的行。这可以通过在目标函数中使用sender.tag 来访问:) @Benjamin1956 还添加了一个完整的视图控制器文件 - 让您尽可能简单:) 我不敢相信我没有马上想到这个。很好的答案。【参考方案2】:

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

希望对你有所帮助,请在 Swift 中浏览 GitHub 代码并参考截图

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

【讨论】:

【参考方案3】:

另一种选择是使用ASValueTrackingSlider。注意是写在ObjectiveC

【讨论】:

以上是关于Swift:如何在动态 UITableView 的自定义单元格中获取滑块的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中动态更改包含 UICollectionView 单元格的 UITableView 单元格的高度?

如何在 swift 2.0 中提取 JSON 数据以在 UITableView 中动态应用?

iOS:在 Swift 中动态设置 UITableView 高度

UITableView:单击按钮时如何动态更改单元格高度?迅速

如何使用swift在UITableView中有UITextFields时管理键盘?

Swift - 在 Xib 中动态设置 UITableView 高度