如果UIStepper在Swift 4中以编程方式点击,如果它们都在UITableViewCell中,如何更改UILabel的文本?

时间:2017-10-23 15:44:39

标签: ios swift uitableview uilabel uistepper

Swift 4:我有一个静态单元格(分组样式)。我只是在单元格中添加了UILabel和UIStepper。现在,当我点击UIStepper时,我想更改UILabel的文本。就像图片一样:

Picture 1

以下是我的代码:

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:)'

Picture

但是如果在单元格之外添加了labelValueChanged函数,则标签和UIStepper的值将不可用。

有没有办法让它成真?任何建议,将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

  

有没有办法让它成为现实?

一种方法是使用步进器的tag属性来存储单元格的行号。然后,视图控制器可以获取步进器的tag并知道哪个行受到影响。但这并不理想,因为它对于具有多个部分的表格并不适用。

  

如果在单元格内添加了labelValueChanged函数,则会出错:Argument of '#selector' cannot refer to local function 'labelValueChanged(sender:)'

我无法确定你为什么遇到这个问题,但是你当然可以将IBAction方法添加到自定义表格单元类中,将步进器的目标设置为单元格,并将步进器的操作设置为该方法。而且您不需要以编程方式设置目标和操作 - 您可以在情节提要编辑器中配置它们。一个好的策略是让单元格将实际工作委托给某个控制器对象,可能是视图控制器。将步进器的目标设置为单元格允许单元格调用控制器中的方法,该方法包含的参数多于简单的操作(仅具有sender参数),因此您可以传递行和节,如何步进器值已更改,以及您可能需要的任何其他内容。