我有一个大表,旨在更新客户数据保护首选项。
某些表格中填充了可重复使用的单元格,其中包含可变数量的复选框,并且根据从服务器返回的json,可以预先检查其中一些复选框。
当我将预检查状态从tableView传递到单元格时,cellForRowAt一切正常(预先检查了预先检查的复选框)。我遇到的问题是这些是可重用的单元格,在用户更改了它们的选择之后,向上或向下滚动表会触发对setupCell函数的更多调用,然后将复选框重置为其原始的预先检查状态。
所以,我的问题是......
在用可恢复单元格滚动表格后,我有哪些选项可以保留用户的选择?
setupCell中的switch语句当前通过调用updateSelections()来设置预选。显然这是问题的原因,我对完全将逻辑直接放在单元格中并不完全满意,但是只执行一次逻辑的最佳位置在哪里?或者,使用可重复使用的单元格完全是错误的方法来进行预选?
欢迎任何建议。这里有一个小代码片段来说明这一点:
// 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
}
}
答案 0 :(得分:3)
viewModels保存设置每个单元格所需的信息吗?你从服务中收到了viewModels吗?
如果是这样,当用户更改特定复选框时,您应该更新相应的viewModel。因此,当您在setupCell
内调用cellForRowAt
时,您应该传递每个viewModel的更新信息,从而导致每个复选框的状态正确。
答案 1 :(得分:1)
您应该为您放在MarketingChannelPreferencesTableViewCells上的复选框按钮制作一些操作方法,并根据更改这些复选框的值来更改您的viewModels。因此,当用户滚动重新加载单元格数据时,单元格会显示viewModel的新数据
答案 2 :(得分:0)
有几种方法。 我已经创建了一个小项目,也许它可以帮助您解决问题。
https://drive.google.com/open?id=1d_RFdr6luNvRTdSC6XNE2vRWTi2IRyuT