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

Posted

技术标签:

【中文标题】当 UIStepper 在 Swift 4 中以编程方式点击时如何更改 UILabel 的文本,如果它们都在 UITableViewCell 中?【英文标题】:How to change an UILabel's text when an UIStepper tapped programmatically in Swift 4, if they are both in an UITableViewCell? 【发布时间】:2017-10-23 15:44:39 【问题描述】:

Swift 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 函数被添加到单元格之外,则 label 和 UIStepper 的值将不可用。

有什么方法可以实现吗?任何建议,将不胜感激。谢谢。

【问题讨论】:

您可以创建一个自定义单元子类并让它管理自己的步进器和标签。 @rmaddy 我的问题是如果我从单元格中删除了该功能,如何更改标签的文本。 @PhillipMills 谢谢,菲利普。我试试看。 【参考方案1】:

有什么方法可以实现吗?

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

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

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

【讨论】:

感谢您的所有意见。正如您所说,IBAction 会更简单。是的,我在寻求帮助之前尝试过。但正如您所见,如果我有 10 个或更多部分,Xcode 有时会卡住。这就是我转向纯代码的原因。 UIStepper、DatePicker 和静态部分是噩梦。

以上是关于当 UIStepper 在 Swift 4 中以编程方式点击时如何更改 UILabel 的文本,如果它们都在 UITableViewCell 中?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - UIStepper

swift - 如何从另一个类设置 UIStepper 值?

swift 实践- 13 -- UIStepper

当 BLE 在 Swift 中以编程方式连接时,蓝牙设备设置中缺少信息按钮

TableView 限制使用 (Swift)

当 iAd 横幅出现时,如何将视图的内容上移? (在 Swift 中以编程方式)