Swift iOS开发求助:统计TableView单元格选中按钮的Yes/No数量
解决方案步骤
1. 定义数据模型存储回答状态
你之前只做了UI交互,但没持久化用户的选择,所以统计不到数据。先创建一个结构体来记录每个问题的回答状态:
struct QuestionResponse { let question: String var selectedAnswer: String? // 存储"Yes"/"No",nil代表未作答 }
然后在你的ViewController里初始化5个问题的数组:
var questionResponses: [QuestionResponse] = [ QuestionResponse(question: "问题1", selectedAnswer: nil), QuestionResponse(question: "问题2", selectedAnswer: nil), QuestionResponse(question: "问题3", selectedAnswer: nil), QuestionResponse(question: "问题4", selectedAnswer: nil), QuestionResponse(question: "问题5", selectedAnswer: nil) ]
2. 给自定义Cell添加选择回调与状态控制
修改你的自定义TableViewCell,用闭包把用户的选择传递给ViewController,同时处理按钮选中样式:
class QuestionCell: UITableViewCell { @IBOutlet weak var questionLabel: UILabel! @IBOutlet weak var yesButton: UIButton! @IBOutlet weak var noButton: UIButton! // 闭包用于传递用户选择结果 var didSelectAnswer: ((String) -> Void)? override func awakeFromNib() { super.awakeFromNib() yesButton.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside) noButton.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside) resetButtonStyle() } @objc private func buttonTapped(_ sender: UIButton) { let answer = sender == yesButton ? "Yes" : "No" didSelectAnswer?(answer) updateButtonStyle(selectedAnswer: answer) } // 用数据配置Cell内容与按钮状态 func setup(with response: QuestionResponse) { questionLabel.text = response.question updateButtonStyle(selectedAnswer: response.selectedAnswer) } // 更新按钮背景色 private func updateButtonStyle(selectedAnswer: String?) { yesButton.backgroundColor = selectedAnswer == "Yes" ? .systemBlue : .white noButton.backgroundColor = selectedAnswer == "No" ? .systemBlue : .white } private func resetButtonStyle() { yesButton.backgroundColor = .white noButton.backgroundColor = .white } }
3. 在VC中绑定Cell与数据,更新模型
在TableView的数据源方法里,把数据传给Cell,同时接收用户选择并更新模型:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "QuestionCell", for: indexPath) as! QuestionCell let response = questionResponses[indexPath.row] cell.setup(with: response) // 接收Cell传来的选择,更新对应问题的回答状态 cell.didSelectAnswer = { [weak self] answer in guard let self = self else { return } self.questionResponses[indexPath.row].selectedAnswer = answer self.checkAllAnswered() } return cell }
4. 控制Continue按钮的启用状态
写一个方法检查所有问题是否都已作答,动态更新按钮状态:
private func checkAllAnswered() { // 检查每个问题的回答都不为空 let allDone = questionResponses.allSatisfy { $0.selectedAnswer != nil } continueButton.isEnabled = allDone }
记得在viewDidLoad里调用一次,让按钮初始处于禁用状态:
override func viewDidLoad() { super.viewDidLoad() checkAllAnswered() }
5. 统计Yes/No数量
在Continue按钮的点击事件里,遍历数组统计结果:
@IBAction func continueTapped(_ sender: UIButton) { let yesCount = questionResponses.filter { $0.selectedAnswer == "Yes" }.count let noCount = questionResponses.filter { $0.selectedAnswer == "No" }.count // 这里可以用统计结果做后续操作,比如打印、跳转页面等 print("Yes: \(yesCount), No: \(noCount)") }
内容的提问来源于stack exchange,提问作者Divya
相关产品推荐
相关产品推荐

