使用可重用单元格的数据持久性

时间:2018-04-20 09:56:18

标签: swift uitableview mvvm

我有一个大表,旨在更新客户数据保护首选项。

某些表格中填充了可重复使用的单元格,其中包含可变数量的复选框,并且根据从服务器返回的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
    }
}

3 个答案:

答案 0 :(得分:3)

viewModels保存设置每个单元格所需的信息吗?你从服务中收到了viewModels吗?

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

答案 1 :(得分:1)

您应该为您放在MarketingChannelPreferencesTableViewCells上的复选框按钮制作一些操作方法,并根据更改这些复选框的值来更改您的viewModels。因此,当用户滚动重新加载单元格数据时,单元格会显示viewModel的新数据

答案 2 :(得分:0)

有几种方法。 我已经创建了一个小项目,也许它可以帮助您解决问题。

https://drive.google.com/open?id=1d_RFdr6luNvRTdSC6XNE2vRWTi2IRyuT