Lou*_*key 3 tableview uistepper swift
另一个Swift初学者来了.我只想在每个TableView单元格中使用一个Stepper来增加同一单元格中的标签.
我在这个主题上找到了几个问题,但是它们包含了其他元素,而我却无法提取基本概念.
Swift Stepper Action在同一个单元格内更改UITextField和UILabel
到目前为止,我已经为我的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)
我不知道这是否是我应该采取的方法.我正在寻找最简单的解决方案,但我无法将各个部分组合在一起.
任何帮助表示赞赏.谢谢.
最简单的解决方案(简单):
创建一个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)神奇之处在于:当您点击步进器时,标签以及数据源阵列将会更新.所以即使在滚动之后,单元格也会始终获得实际数据.
通过这种方式,您不需要协议或回调闭包.唯一重要的是模型是具有引用类型语义的类.
| 归档时间: |
|
| 查看次数: |
2819 次 |
| 最近记录: |