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

时间:2017-03-18 16:14:17

标签: swift tableview uistepper

另一位Swift初学者来自这里。我只想在每个TableView单元格中使用一个Stepper来增加同一单元格中的标签。

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

Swift Stepper Action that changes UITextField and UILabel within same cell

Stepper on tableview cell (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

    }

}

我理解在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)
    }
}

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

感谢任何帮助。 谢谢。

2 个答案:

答案 0 :(得分:5)

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

  • 使用属性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
    }
    

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

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

答案 1 :(得分:0)

注意:我的Cell类正常。所有更改都在viewcontroller类中

class cell: UITableViewCell {

    @IBOutlet weak var ibAddButton: UIButton!
    @IBOutlet weak var ibStepper: UIStepper!
    @IBOutlet weak var ibCount: UILabel!
    @IBOutlet weak var ibLbl: UILabel!
}

1.define空的int数组[Int]()

var countArray = [Int]()

2。将countArray附加为全零,并添加要在表格视图中填充的数据数量

 for arr in self.responseArray{
        self.countArray.append(0)
   }

在第3行的单元格中

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

         let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! cell
         let dict = responseArray[indexPath.row] as? NSDictionary ?? NSDictionary()
         cell.ibLbl.text = dict["name"] as? String ?? String()
         if countArray[indexPath.row] == 0{
             cell.ibAddButton.tag = indexPath.row
             cell.ibStepper.isHidden = true
             cell.ibAddButton.isHidden = false
             cell.ibCount.isHidden = true
             cell.ibAddButton.addTarget(self, action: #selector(addPressed(sender:)), for: .touchUpInside)
         }else{
             cell.ibAddButton.isHidden = true
             cell.ibStepper.isHidden = false
             cell.ibStepper.tag = indexPath.row
             cell.ibCount.isHidden = false
             cell.ibCount.text = "\(countArray[indexPath.row])"
             cell.ibStepper.addTarget(self, action: #selector(stepperValueChanged(sender:)), for: .valueChanged)}
    return cell
     }

4.objc函数

 @objc func stepperValueChanged(sender : UIStepper){
     if sender.stepValue != 0{
         countArray[sender.tag] = Int(sender.value)
     }
     ibTableView.reloadData()
 }
 @objc func addPressed(sender : UIButton){

     countArray[sender.tag] = 1//countArray[sender.tag] + 1
     ibTableView.reloadData()
 }