Swift - 如何在按下不同自定义单元格中的按钮时获取自定义单元格标签的值?

时间:2018-02-09 09:14:10

标签: ios uitableview xib

遇到这个问题,打了一下砖墙。

我有一个TableView动态原型。 TableView有2个部分。

第1节从xib文件加载自定义TableViewCell。单元格包含一个步进器和一个标签:

class quantityTableViewCell: UITableViewCell {

 @IBOutlet weak var quantityLabel: UILabel!


 @IBAction func quantityStepper(_ sender: UIStepper) {
    quantityLabel.text = String(Int(sender.value))
 }

}

第2节加载另一个自定义TableViewCell,它只包含一个按钮:

class addToBasketTableViewCell: UITableViewCell {

 @IBOutlet weak var submitButton: UIButton!

}

现在在我的TableView类中,两个单元格都在各自的部分中加载,我想在第二部分中单击按钮并将结果打印到控制台时,在第一部分内捕获'quantityLabel'的当前值。

例如,如果我将值调到5,当我点击'submitButton'时会打印'5'。

我有点不确定如何解决这个问题,任何指导都会很棒。下面是正在加载的单元格的副本:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let item: ItemPreBasketModel = cellItems[indexPath.row] as! ItemPreBasketModel

    if indexPath.section == 0 {

        let quantityCell = Bundle.main.loadNibNamed("quantityTableViewCell", owner: self, options: nil)?.first as! quantityTableViewCell
        return quantityCell

        } else if indexPath.section == 1 {

        let addToBasketCell = Bundle.main.loadNibNamed("addToBasketTableViewCell", owner: self, options: nil)?.first as! addToBasketTableViewCell
        return addToBasketCell

    }
}

2 个答案:

答案 0 :(得分:2)

它应该是这样的:

let path = IndexPath(item: 0, section: 0)
let cell = table.cellForRow(at: path) as? quantityTableViewCell
print(cell?.quantityLabel.text)

将“table”替换为您的表格对象。

答案 1 :(得分:1)

您永远不应该依赖单元格中的值,因为当用户滚动表格视图时,单元格可能会出现和消失。

相反,您应该将步进器的值存储在模型中,当用户点击按钮时,从模型中读取值(而不是从任何单元格中读取)。

所以:

  • 调用quantityStepper时,更新标签并通知某个代理(例如托管视图控制器)该值已更改。意识到:
    1. 您应该 直接从quantityTableViewCell
    2. 中更新模型
    3. 相反,您应该向某个委托(实现此协议)发送一条消息(=您自己的协议),以通知它该值已更改为某个值
    4. 代表(可能是您的视图控制器)会将此值存储在某处
  • 调用addToBasketTableViewCell时,您还应该通知代理人。然后委托(您的视图控制器)将使用他在3中获得的值,并执行必须执行的操作。

通过这个approch,细胞彼此分离。您对单元重用没有任何问题,并且您可以正确初始化单元格,因为该值始终存储在模型中,并且单元格仅显示它。更新始终反映在模型中。