【问题标题】:Swift: How to get the value of a slider in a custom cell in a dynamic UITableView?Swift:如何在动态 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 的屏幕截图。

【问题讨论】:

    标签: swift uitableview uislider


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 2011-11-27
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多