另一个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) } }
我不知道这是否是我应该尝试的方法。我正在寻找最简单的解决方案,但是我很难将各个部分放在一起。
任何帮助表示赞赏。谢谢。
最简单的解决方案(简化):
创建一个BuyStat具有属性的模型purchaseAmount(成为一个类至关重要)。 强烈建议您不要使用多个数组作为数据源
BuyStat
purchaseAmount
class BuyStat { var purchaseAmount = 0.0 init(purchaseAmount : Double) { self.purchaseAmount = purchaseAmount }
}
在视图控制器中创建一个数据源数组
var stats = [BuyStat]()
在viewDidLoad创建一些实例并重新加载表视图
viewDidLoad
stats = [BuyStat(purchaseAmount: 12.0), BuyStat(purchaseAmount: 20.0)]
tableView.reloadData()
在自定义单元格中创建一个属性buyStat,以使用观察者来保存当前数据源项,以在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获取数据源项并将其传递到单元格
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
魔术是 :当您点击步进器时,标签以及数据源阵列将被更新。因此,即使在滚动之后,单元格也将始终获得实际数据。
这样,您就不需要协议或回调闭包。只有模型是具有引用类型语义的类才是重要的。