我有两种类型的表格单元格,一种有6个按钮,每个按钮都有一个数字值,另一种单元格有一个按钮,计算所选数字的总和,并有一个标签显示这个总和。
我的问题是我拿不到标签来计算总数。这是我目前掌握的信息
细胞数量:
protocol ToggleNumberCellDelegate: AnyObject {
/// This method detects the selected value of the cell.
func toggleNumberCell(_ toggleNumberCell: ToggleNumberCell, selectedValue: Int)
}
class ToggleNumberCell: UITableViewCell {
static let reuseIdentifier = String(describing: ToggleNumberCell.self)
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var zeroButton: UIButton!
@IBOutlet private weak var oneButton: UIButton!
@IBOutlet private weak var twoButton: UIButton!
@IBOutlet private weak var threeButton: UIButton!
@IBOutlet private weak var fourButton: UIButton!
@IBOutlet private weak var fiveButton: UIButton!
@IBOutlet private weak var sixButton: UIButton!
private weak var delegate: ToggleNumberCellDelegate?
private var value: Int?
//...
@IBAction func buttonTapped(_ sender: UIButton) {
switch sender {
case zeroButton:
self.zeroButton.backgroundColor = UIColor.NBABlue
self.zeroButton.tintColor = UIColor.white
self.value = 0
self.delegate?.toggleNumberCell(self, selectedValue: self.value!)
print("The value you tapped is \(value)")
case oneButton:
self.oneButton.backgroundColor = UIColor.NBABlue
self.oneButton.tintColor = UIColor.white
self.value = 1
self.delegate?.toggleNumberCell(self, selectedValue: self.value!)
print("The value you tapped is \(value)")
case twoButton:
self.twoButton.backgroundColor = UIColor.NBABlue
self.twoButton.tintColor = UIColor.white
self.value = 2
self.delegate?.toggleNumberCell(self, selectedValue: self.value!)
print("The value you tapped is \(value)")
上面的代码只是设置按钮,并通过使用它的委托给每个按钮一个值。
标签细胞
class CalculateCell: UITableViewCell, ToggleNumberCellDelegate {
var increment = 0
static let reuseIdentifier = String(describing: CalculateCell.self)
@IBOutlet private weak var calculateButton: UIButton!
@IBOutlet private weak var totalLabel: UILabel!
func configure(answer: AnswerModel) {
self.backgroundColor = UIColor.secondarySystemGroupedBackground
self.totalLabel.text = answer.text
self.totalLabel.font = .preferredFont(forTextStyle: .headline)
calculateButton.layer.cornerRadius = 10.0
}
override func prepareForReuse() {
super.prepareForReuse()
self.totalLabel.text = nil
}
@IBAction func calculateTapped(_ sender: UIButton) {
// You need to get the selected value in here somehow.
}
func toggleNumberCell(_ toggleNumberCell: ToggleNumberCell, selectedValue: Int) {
increment = selectedValue
}
}
这里我调用委托来获得选定的值但我想我做错了谁能告诉我如何计算总值?
这是我想要实现的一个截图。
###你的方法有一个基本的问题。不应该在表视图单元格中存储数据。它们是视图,应该显示数据而不是存储数据。
您应该设置一个模型对象来存储UI的状态。(它可以像一个整数数组一样简单,每个ToggleNumberCell的值在你的表视图中的一个。)
你应该有一个控制器对象作为ToggleNumberCell的委托。当它的toggleNumberCell方法被调用时,它将更新数据模型中该单元格条目的计数,然后告诉总单元格更新自己。表视图数据源将查询模型,并使用模型中每个条目的值来计算总数,然后将该值安装到总单元格中。
###我会建议你把UIViewController(比管理UITableView) ToggleNumberCellDelegate。然后那个视图控制器可以跟踪所有按钮的总数。然后视图控制器可以提供总数
CalculateCell。这就分离了单元格之间的逻辑。理想情况下,控制器管理逻辑,而单元格只是显示数据的视图。
此外,我将改变toggleNumberCell函数如下:
func toggleNumberCell(_ toggleNumberCell: ToggleNumberCell, selectedValue: Int) {
// Using += will result in adding to the existing value instead of overwriting it
increment += selectedValue
}