You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:55:17