【发布时间】:2018-04-20 09:56:18
【问题描述】:
我有一个大表,旨在更新客户数据保护偏好。
某些表格填充了可重复使用的单元格,其中包含可变数量的复选框,并且根据从服务器返回的 json,其中一些复选框可能会被预先选中。
当我将预先选中的状态从 tableView cellForRowAt 传递给单元格时,一切都很好(预先选中的复选框是预先选中的)。我遇到的问题是这些是可重复使用的单元格,并且在用户更改了他们的选择之后,向上或向下滚动表格会触发对 setupCell 函数的更多调用,然后将复选框重置为其原始的预检查状态。
所以,我的问题是……
在用户滚动包含可重复单元格的表格后,我有哪些选项可以保留用户的选择?
setupCell 中的 switch 语句当前通过调用 updateSelections() 来设置预选。显然这是问题的原因,无论如何我对直接在单元格中放置逻辑并不完全满意,但是只执行一次此逻辑的最佳位置在哪里?或者,使用可重复使用的单元格是完全错误的预选方法吗?
欢迎提出任何建议。这是一个小代码sn-p来说明这一点:
// UITableViewDataSource - passing the previous selections to setupCell in the UITableViewCell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let viewModel = viewModels[indexPath.row]
switch viewModel {
case .preferences(let preferenceId, let titleText, let isEnabled):
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Preferences") as? MarketingChannelPreferencesTableViewCell else {
return UITableViewCell()
}
cell.setupCell(id: id, text: text, isPreChecked: isPreChecked)
return cell
}
}
// UITableViewCell
func setupCell(id: String, text: String, isPreChecked: Bool) {
switch id {
case "email":
emailSelected = isPreChecked
updateSelections(id: id, isPreChecked: emailSelected)
case "post":
postSelected = isPreChecked
updateSelections(id: id, isPreChecked: postSelected)
case "text":
textSelected = isPreChecked
updateSelections(id: id, isPreChecked: textSelected)
default:
break
}
}
【问题讨论】:
标签: swift uitableview mvvm