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

标签 swift tableview uistepper

这里是另一个 Swift 初学者。我只是想在我的每个 TableView 单元格中使用一个步进器来递增同一单元格中的标签。

我发现了几个关于这个主题的问题,但它们包含其他元素,我无法提取基本概念。

Swift Stepper Action that changes UITextField and UILabel within same cell

Stepper on tableview cell (swift)

到目前为止,我已经为我的标签和步进器连接了 IBOutlets,并为我的单元格类中的步进器连接了一个 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)和另一个函数,如下所示

protocol ReviewCellDelegate{
    func stepperButton(sender: ReviewTableViewCell)
}

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

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

感谢任何帮助。 谢谢。

最佳答案

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

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

    class BuyStat {
    
        var purchaseAmount = 0.0
    
        init(purchaseAmount : Double) {
            self.purchaseAmount = purchaseAmount
        }
    }
    
  • 在 View Controller 中创建一个数据源数组

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

    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
    }
    

神奇之处在于:当您点击步进器时,标签和数据源数组都会更新。因此,即使在滚动单元格后也将始终获得实际数据。

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

关于Swift - 在 TableView 单元格中使用步进器增加标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42876739/

相关文章:

swift - 将 Base64 图像上传到服务器时出错

ios - 我如何将数据从 View Controller 传递到容器 View ?

ios - 未调用 Swift viewWillTransition

ios - 在 iOS 8.3 上使用 CoreSpotlight (9.0+) 启动应用程序时 Xcode 崩溃

ios - 防止 TableView 单元格在单元格操作后关闭

swift - 将搜索栏添加到表格 View

java - 为什么 JavaFX table.getItems().clear() 也会清除 ObservableList

ios - 无法识别的选择器发送到实例(UIStepper)

swift - 滚动影响内部数据时调用 reloadData()

ios - 如何从 UITableViewCell 内部判断其父 TableView 何时被弹出?