我正在尝试使用复选框选择表视图行。但是,如果我选择了第一个单元格,那么第二个单元格也会被选中。如果选择第二个单元格,则选择第三个单元格,如果选择第三个单元格,则选择第一个单元格。为什么会这样?你能帮我纠正这个问题吗?
代码:
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()
}
}
1条答案
按热度按时间7gyucuyw1#
你的错误在这里:
这是完全错误的。永远不要以这种方式直接与细胞对话。仅与 * 数据模型 *(
subscriptionList?.result?.subscriptionData
)对话。然后重新加载表视图,让cellForRow
读取单个索引路径的数据模型,并相应地配置单元格(就像它已经在做的那样)。并删除单元格的
isChecked
属性。一个单元格是 view,而且是一个高度不稳定的视图(因为单元格,正如您所知道的,是重用的);小区必须不进行任何保持 * 状态 * 的尝试。