Swift - 在 TableView 单元格中使用步进器增加标签
Swift - Increment Label with Stepper in TableView Cell
这里又是一位 Swift 初学者。我只是想在我的每个 TableView 单元格中使用一个步进器来递增同一单元格中的标签。
我发现了几个关于这个主题的问题,但它们包含其他元素,我无法提取基本概念。
Swift Stepper Action that changes UITextField and UILabel within same cell
到目前为止,我已经为我的标签和步进器连接了 IBOutlets,并为我的单元格中的步进器连接了一个 IBAction class。
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)
}
}
我不知道这是否是我应该尝试采用的方法。我正在寻找最简单的解决方案,但我无法将各个部分组合在一起。
感谢任何帮助。
谢谢。
最简单的解决方案(简化):
用属性purchaseAmount
创建模型BuyStat
(成为class至关重要)。
强烈建议您不要使用多个数组作为数据源
class BuyStat {
var purchaseAmount = 0.0
init(purchaseAmount : Double) {
self.purchaseAmount = purchaseAmount
}
}
在视图控制器中创建一个数据源数组
var stats = [BuyStat]()
在 viewDidLoad
中创建几个实例并重新加载 table 视图
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
}
神奇之处在于:当您点击步进器时,标签和数据源数组都会更新。因此,即使在滚动单元格后也将始终获得实际数据。
通过这种方式,您不需要协议或回调闭包。唯一重要的是模型是 class 具有引用类型语义。
注意:我的手机 class 正常..所有更改都在 viewcontroller class
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]()
var countArray = [Int]()
2.append countArray,全为零以及您要在 tableview 中填充的数据数
for arr in self.responseArray{
self.countArray.append(0)
}
3.in 行的单元格
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()
}
这里又是一位 Swift 初学者。我只是想在我的每个 TableView 单元格中使用一个步进器来递增同一单元格中的标签。
我发现了几个关于这个主题的问题,但它们包含其他元素,我无法提取基本概念。
Swift Stepper Action that changes UITextField and UILabel within same cell
到目前为止,我已经为我的标签和步进器连接了 IBOutlets,并为我的单元格中的步进器连接了一个 IBAction class。
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)
}
}
我不知道这是否是我应该尝试采用的方法。我正在寻找最简单的解决方案,但我无法将各个部分组合在一起。
感谢任何帮助。 谢谢。
最简单的解决方案(简化):
用属性
purchaseAmount
创建模型BuyStat
(成为class至关重要)。
强烈建议您不要使用多个数组作为数据源class BuyStat { var purchaseAmount = 0.0 init(purchaseAmount : Double) { self.purchaseAmount = purchaseAmount } }
在视图控制器中创建一个数据源数组
var stats = [BuyStat]()
在
viewDidLoad
中创建几个实例并重新加载 table 视图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 }
神奇之处在于:当您点击步进器时,标签和数据源数组都会更新。因此,即使在滚动单元格后也将始终获得实际数据。
通过这种方式,您不需要协议或回调闭包。唯一重要的是模型是 class 具有引用类型语义。
注意:我的手机 class 正常..所有更改都在 viewcontroller class
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]()
var countArray = [Int]()
2.append countArray,全为零以及您要在 tableview 中填充的数据数
for arr in self.responseArray{
self.countArray.append(0)
}
3.in 行的单元格
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()
}