Swift 具有可重用单元的数据持久性

Swift 具有可重用单元的数据持久性,swift,uitableview,mvvm,Swift,Uitableview,Mvvm,我有一个大表,用于更新客户的数据保护首选项 表中的某些部分填充了可重复使用的单元格,这些单元格包含数量可变的复选框,根据服务器返回的json,其中一些复选框可能会被预先选中 当我将预选中状态从tableView传递到单元格CellForRow时,所有已预选中的复选框都已预选中。我遇到的问题是,这些是可重用的单元格,在用户更改其选择后,上下滚动表格会触发更多对setupCell函数的调用,然后将复选框重置为其原始预选中状态 所以,我的问题是 在用户滚动带有可恢复单元格的表格后,我可以选择哪些选项来

我有一个大表,用于更新客户的数据保护首选项

表中的某些部分填充了可重复使用的单元格,这些单元格包含数量可变的复选框,根据服务器返回的json,其中一些复选框可能会被预先选中

当我将预选中状态从tableView传递到单元格CellForRow时,所有已预选中的复选框都已预选中。我遇到的问题是,这些是可重用的单元格,在用户更改其选择后,上下滚动表格会触发更多对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
    }
}
有几种方法。 我已经创建了一个小项目,也许它会给你一个解决问题的方法


您应该为放置在MarketingChannelPreferencesTableViewCells上的复选框按钮制定一些操作方法,并根据这些复选框的值更改viewModels。因此,当单元格数据通过用户滚动重新加载时,单元格显示viewModel的新数据,viewModels是否保存了设置每个单元格所需的信息?您是否从服务中收到viewModels


如果是这样,当用户更改特定复选框时,您应该更新相应的viewModel。因此,当您在cellForRowAt内调用setupCell时,您应该传递每个viewModel的更新信息,从而使每个复选框的状态正确。

correct。不幸的是,我在发帖后不久就得出了这个结论!谢谢现在检查