【问题标题】:Data persistence with reusable cells可重用单元的数据持久性
【发布时间】: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


    【解决方案1】:

    viewModel 包含设置每个单元所需的信息,对吗?并且您从服务接收 viewModel?

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

    【讨论】:

    • 正确。不幸的是(对我来说)我在发布问题后不久就得出了这个结论!谢谢。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      有几种方法。 我创建了一个小项目,也许它会给你一个解决问题的方法。

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

      猜你喜欢
      • 2013-02-15
      • 2014-06-25
      • 2021-02-17
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2015-12-23
      相关资源
      最近更新 更多