Создание модели для поддержания состояния yesButton и noButton для каждого tableViewCell, т. Е.
class Model {
var isYesSelected = false
var isNoSelected = false
}
Создание пользовательского UITableViewCell
с Outlets
из yesButton
и noButton
.
Создайте один @IBAction
для обоих buttons
и обработайте их пользовательский интерфейс, в соответствии с которым набирается button
.
Кроме того, используйте buttonTapHandler
, чтобы определить row
, в которомbutton
постучал.Он будет вызываться каждый раз при нажатии button
.Мы установим это при создании экземпляра TableViewCell
в tableView(_:cellForRowAt:)
.
class TableViewCell: UITableViewCell {
@IBOutlet weak var yesButton: UIButton!
@IBOutlet weak var noButton: UIButton!
var buttonTapHandler: (()->())?
var model: Model?
override func prepareForReuse() {
super.prepareForReuse()
yesButton.backgroundColor = .gray
noButton.backgroundColor = .gray
}
func configure(with model: Model) {
self.model = model
self.updateUI()
}
@IBAction func onTapButton(_ sender: UIButton) {
model?.isYesSelected = (sender == yesButton)
model?.isNoSelected = !(sender == yesButton)
self.updateUI()
}
func updateUI() {
yesButton.backgroundColor = (model?.isYesSelected ?? false) ? .green : .gray
noButton.backgroundColor = (model?.isNoSelected ?? false) ? .green : .gray
}
}
UITableViewDataSource's
tableView(_:cellForRowAt:)
метод выглядит так:
let numberOfCells = 10
var models = [Model]()
override func viewDidLoad() {
super.viewDidLoad()
(0..<numberOfCells).forEach { _ in
self.models.append(Model())
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numberOfCells
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath) as! TableViewCell
cell.configure(with: models[indexPath.row])
cell.buttonTapHandler = {
print(indexPath.row)
}
return cell
}
Чтобы получитьtotalPoints
, считать models
с isYesSelected = true
, то есть
let totalPoints = models.reduce(0) { (result, model) -> Int in
if model.isYesSelected {
return result + 1
}
return 0
}
print(totalPoints)