【问题标题】:Swift - How to get the value of a custom cell label when pressing a button in a different custom cell?Swift - 在不同的自定义单元格中按下按钮时如何获取自定义单元格标签的值?
【发布时间】:2018-02-09 09:14:09
【问题描述】:

遇到这个问题有点麻烦。

我有一个动态原型的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,当我点击“提交按钮”时,它会打印“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

    }
}

【问题讨论】:

    标签: ios uitableview xib


    【解决方案1】:

    应该是这样的:

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

    用您的表格对象替换“表格”。

    【讨论】:

      【解决方案2】:

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

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

      所以:

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

      通过这种方法,单元格彼此分离。重用单元格没有任何问题,并且可以正确初始化单元格,因为该值始终存储在模型中,并且单元格只显示它。更新总是反映到模型中。

      【讨论】:

      • 非常感谢您的详细解释。完全有道理。我将继续执行您的建议。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多