UISlider 未更新 Swift 中的当前值
UISlider not updating current value in Swift
我在 table 视图单元格中有一个滑块,我正在尝试将标签的文本设置为滑块的值。但是,文本未设置为更改后的滑块值。我做错了什么?
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)
}
您缺少滑块拖动操作。
slider.addTarget(自我,行动:"sliderValueDidChange",forControlEvents:.ValueChanged)
func sliderValueDidChange(sender:UISlider!){
println("value--\(sender.value)")
label.text = String(sender.value)
}
您可以使用slider.superview或将索引存储在滑块的标签中,以获取对滑块所属单元格的引用并访问标签。
更好的解决方案是为单元格创建自定义 class。
通常,您应该向滑块添加一个动作:
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 class 并在其中轻松定义滑块、标签和操作。
** 我的建议:使用故事板,然后轻松设计视图并使用自定义的 TableViewCell class。
一个示例 table 视图单元格 class 给你(类似于我自己项目中的一个):
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
}
}
将此添加到您的 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
。
你可以使用一些技巧来做到这一点,首先你需要按照建议设置 UISlider
的目标,另一点是获取选定的行,你可以实现保存在 tag
属性 和 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 设置自定义单元格更容易,但这取决于您。
希望对你有所帮助。
我在 table 视图单元格中有一个滑块,我正在尝试将标签的文本设置为滑块的值。但是,文本未设置为更改后的滑块值。我做错了什么?
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)
}
您缺少滑块拖动操作。 slider.addTarget(自我,行动:"sliderValueDidChange",forControlEvents:.ValueChanged)
func sliderValueDidChange(sender:UISlider!){
println("value--\(sender.value)")
label.text = String(sender.value)
}
您可以使用slider.superview或将索引存储在滑块的标签中,以获取对滑块所属单元格的引用并访问标签。
更好的解决方案是为单元格创建自定义 class。
通常,您应该向滑块添加一个动作:
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 class 并在其中轻松定义滑块、标签和操作。
** 我的建议:使用故事板,然后轻松设计视图并使用自定义的 TableViewCell class。
一个示例 table 视图单元格 class 给你(类似于我自己项目中的一个):
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
}
}
将此添加到您的 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
。
你可以使用一些技巧来做到这一点,首先你需要按照建议设置 UISlider
的目标,另一点是获取选定的行,你可以实现保存在 tag
属性 和 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 设置自定义单元格更容易,但这取决于您。
希望对你有所帮助。