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

Lou*_*key 3 tableview uistepper swift

另一个Swift初学者来了.我只想在每个TableView单元格中使用一个Stepper来增加同一单元格中的标签.

我在这个主题上找到了几个问题,但是它们包含了其他元素,而我却无法提取基本概念.

Swift Stepper Action在同一个单元格内更改UITextField和UILabel

tableview单元格上的步进(swift)

到目前为止,我已经为我的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

    }

}
Run Code Online (Sandbox Code Playgroud)

我理解在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
}
Run Code Online (Sandbox Code Playgroud)

其中一个已经问过的问题包括一个协议和ViewController中的另一个函数

protocol ReviewCellDelegate{
    func stepperButton(sender: ReviewTableViewCell)
}

func stepperButton(sender: ReviewTableViewCell) {
    if let indexPath = tableView.indexPathForCell(sender){
        print(indexPath)
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是我应该采取的方法.我正在寻找最简单的解决方案,但我无法将各个部分组合在一起.

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

vad*_*ian 6

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

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

    class BuyStat {
    
        var purchaseAmount = 0.0
    
        init(purchaseAmount : Double) {
            self.purchaseAmount = purchaseAmount
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在视图控制器中创建数据源数组

    var stats = [BuyStat]()
    
    Run Code Online (Sandbox Code Playgroud)
  • viewDidLoad创建几个实例并重新加载表视图

    stats = [BuyStat(purchaseAmount: 12.0), BuyStat(purchaseAmount: 20.0)]
    tableView.reloadData()
    
    Run Code Online (Sandbox Code Playgroud)
  • 在自定义单元格中,创建一个属性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)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    }
    
    Run Code Online (Sandbox Code Playgroud)

神奇之处在于:当您点击步进器时,标签以及数据源阵列将会更新.所以即使在滚动之后,单元格也会始终获得实际数据.

通过这种方式,您不需要协议或回调闭包.唯一重要的是模型是具有引用类型语义的类.