一尘不染

Swift-在TableView单元格中使用步进器增加标签

swift

另一个Swift初学者。我只是想在每个TableView单元格中使用一个步进器,以在同一单元格中增加标签。

我已经找到了有关此主题的几个问题,但是它们包含其他元素,因此我无法提取基本概念。

到目前为止,我已经为单元格类中的Label和Stepper连接了IBOutlets,并为Stepper连接了IBAction。

class BuyStatsCell: UITableViewCell{

    //these are working fine

    @IBOutlet weak var category: UILabel!
    @IBOutlet weak var average: UILabel!
    @IBOutlet weak var price: UILabel!


    //Outlet for Label and Stepper - How do I make these work?

    @IBOutlet weak var purchaseAmount: UILabel!
    @IBOutlet weak var addSubtract: UIStepper!

    //Action for Stepper - And this?

    @IBAction func stepperAction(_ sender: UIStepper) {
        self.purchaseAmount.text = Int(sender.value).description

    }

}

而且我了解在cellForRowAt indexPath中重用单元格的概念

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "BuyStatsTabCell", for: indexPath) as! BuyStatsCell

        cell.isUserInteractionEnabled = false

 //these are working

        cell.category.text = categories[indexPath.row]
        cell.price.text = String(prices[indexPath.row])
        cell.average.text = String(averages[indexPath.row])

//but is there something I need to add here to keep the correct Stepper and Label for each class?

    return cell
}

已经问到的一个问题包括协议和ViewController中的另一个函数,如下所示

protocol ReviewCellDelegate{
    func stepperButton(sender: ReviewTableViewCell)
}

func stepperButton(sender: ReviewTableViewCell) {
    if let indexPath = tableView.indexPathForCell(sender){
        print(indexPath)
    }
}

我不知道这是否是我应该尝试的方法。我正在寻找最简单的解决方案,但是我很难将各个部分放在一起。

任何帮助表示赞赏。谢谢。


阅读 209

收藏
2020-07-07

共1个答案

一尘不染

最简单的解决方案(简化):

  • 创建一个BuyStat具有属性的模型purchaseAmount(成为一个类至关重要)。
    强烈建议您不要使用多个数组作为数据源

    class BuyStat {
    
    var purchaseAmount = 0.0
    
    init(purchaseAmount : Double) {
        self.purchaseAmount = purchaseAmount
    }
    

    }

  • 在视图控制器中创建一个数据源数组

    var stats = [BuyStat]()
    
  • viewDidLoad创建一些实例并重新加载表视图

    stats = [BuyStat(purchaseAmount: 12.0), BuyStat(purchaseAmount: 20.0)]
    

    tableView.reloadData()

  • 在自定义单元格中创建一个属性buyStat,以使用观察者来保存当前数据源项,以在buyStat设置时更新步进器和标签

    class BuyStatsCell: UITableViewCell {
    
    @IBOutlet weak var purchaseAmount: UILabel!
    @IBOutlet weak var addSubtract: UIStepper!
    
    var buyStat : BuyStat! {
        didSet {
            addSubtract.value = buyStat.purchaseAmount
            purchaseAmount.text = String(buyStat.purchaseAmount)
        }
    }
    
    @IBAction func stepperAction(_ sender: UIStepper) {
        buyStat.purchaseAmount = sender.value
        self.purchaseAmount.text = String(sender.value)
    }
    

    }

  • cellForRowAtIndexPath获取数据源项并将其传递到单元格

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "BuyStatsTabCell", for: indexPath) as! BuyStatsCell
    cell.buyStat = stats[indexPath.row]
    return cell
    

    }

魔术是 :当您点击步进器时,标签以及数据源阵列将被更新。因此,即使在滚动之后,单元格也将始终获得实际数据。

这样,您就不需要协议或回调闭包。只有模型是具有引用类型语义的类才是重要的。

2020-07-07