斯威夫特4:我有一个静态单元格(分组样式)。我只是在单元格中添加一个UILabel和一个UIStepper。现在我想在点击UIStepper时更改UILabel的文本。就像照片一样:
以下是我的代码:
if indexPath.section == 0 {
cell.textLabel?.text = "\(first[indexPath.row])"
let step = UIStepper()
let label = UILabel()
func labelValueChanged(sender:UIStepper!) {
label.text = "\(Int(step.value))"
}
cell.addSubview(step)
step.translatesAutoresizingMaskIntoConstraints = false
step.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true
step.widthAnchor.constraint(equalToConstant: 94).isActive = true
step.heightAnchor.constraint(equalToConstant: 29).isActive = true
step.rightAnchor.constraint(equalTo: cell.rightAnchor, constant: -30).isActive = true
step.addTarget(self, action: #selector(labelValueChanged), for: .valueChanged)
cell.addSubview(label)
label.text = "0"
label.translatesAutoresizingMaskIntoConstraints = false
label.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true
label.widthAnchor.constraint(equalToConstant: 50).isActive = true
label.heightAnchor.constraint(equalToConstant: 21).isActive = true
label.rightAnchor.constraint(equalTo: cell.rightAnchor, constant: -124).isActive = true
}
如果在单元格内添加了labelValueChanged函数,则会出错:
Argument of '#selector' cannot refer to local function 'labelValueChanged(sender:)'
但是,如果labelValueChanged函数是在单元格外部添加的,则标签和UIStepper的值将不可用。
有什么办法可以做到吗?如有任何建议,将不胜感激。谢谢。
最佳答案
有什么办法可以做到吗?
一种方法是使用步进器的tag
属性来存储单元格的行号。视图控制器可以得到步进器的tag
并知道哪些行受到影响。不过,这并不理想,因为对于具有多个部分的表来说,它并不能很好地工作。
如果在单元格内添加了labelValueChanged函数,则会出错:Argument of '#selector' cannot refer to local function 'labelValueChanged(sender:)'
我不太清楚你为什么会有这个问题,但是你当然可以添加一个IBAction方法到一个自定义的表单元格类中,将步进器的目标设置为单元格,并将步进器的操作设置为该方法。而且您不需要以编程方式设置目标和操作——您可以在脚本编辑器中配置它们。一个好的策略是让单元格将实际工作委托给某个控制器对象,可能是视图控制器。将步进器的目标设置为单元格可以让单元格在控制器中调用一个方法,该方法包含的参数不仅仅是一个简单的操作(它只有一个sender
参数),因此您可以沿着行和节传递步进器值如何更改,以及您可能需要的任何其他信息。