Tableview didSelectRowAt在swift中错误地选择了包含JSON数据的行

6vl6ewon  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(111)

我正在尝试使用复选框选择表视图行。但是,如果我选择了第一个单元格,那么第二个单元格也会被选中。如果选择第二个单元格,则选择第三个单元格,如果选择第三个单元格,则选择第一个单元格。为什么会这样?你能帮我纠正这个问题吗?

代码:

extension StudentSignupStep4ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        subscriptionList?.result?.subscriptionData?.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: SubscriptionTableViewCell.cellId, for: indexPath) as! SubscriptionTableViewCell
        let cellData = subscriptionList?.result?.subscriptionData?[indexPath.row]
        cell.subscriptionNameLabel.text = cellData?.subscription_name
     
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let subscriptionData = subscriptionList?.result?.subscriptionData else { return }
        for i in subscriptionData.indices {
            if let cell = tableView.cellForRow(at: IndexPath(row: i, section: 0)) as? SubscriptionTableViewCell {
                cell.isChecked = i == indexPath.row
            }
        }
        tableView.reloadData()
        subsciptionId = subscriptionList?.result?.subscriptionData?[indexPath.row].id
    }
}

class SubscriptionTableViewCell: UITableViewCell {
    
    @IBOutlet weak var checkboxImageView: UIImageView!
    var isChecked = false {
        didSet {
            checkboxImageView.image = UIImage(systemName: (isChecked) ? "checkmark.square.fill": "square")
            checkboxImageView.tintColor = (isChecked) ? .myAccentColor: .lightGray
        }
    }
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}
7gyucuyw

7gyucuyw1#

你的错误在这里:

for i in subscriptionData.indices {
        if let cell = tableView.cellForRow(at: IndexPath(row: i, section: 0)) as? SubscriptionTableViewCell {
            cell.isChecked = i == indexPath.row
        }
    }

这是完全错误的。永远不要以这种方式直接与细胞对话。仅与 * 数据模型 *(subscriptionList?.result?.subscriptionData)对话。然后重新加载表视图,让cellForRow读取单个索引路径的数据模型,并相应地配置单元格(就像它已经在做的那样)。
并删除单元格的isChecked属性。一个单元格是 view,而且是一个高度不稳定的视图(因为单元格,正如您所知道的,是重用的);小区必须不进行任何保持 * 状态 * 的尝试。

相关问题