当 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 值?