【问题标题】:Working with TableViews and CollectionViews and managing multiple data sources in Swift使用 TableViews 和 CollectionViews 并在 Swift 中管理多个数据源
【发布时间】:2020-02-24 06:48:55
【问题描述】:

我有一个主 ViewController,MainViewController,其中包含许多视图以及一个 TableView

每一行(即tableViewCell)包含来自不同来源/视图等的不同内容。tableView 中的许多行又包含一个名为SettingsCollectionViewCollectionView。在tableViewcellForRowAt 方法中,我为tableViewCell 初始化SettingsCollectionView,并将CollectionView 子类用作其数据源的相应数据传递给它。比如:

tableView 第 0 行 - 包含通用内容

tableView 第 1 行 - settingsCollectionViewA : SettingsCollectionView 以及结构 OriginalDataA

tableView 第 2 行 - 包含通用内容

tableView 第 3 行 - settingsCollectionViewB : SettingsCollectionView 以及结构 OriginalDataB

tableView 第 4 行 - settingsCollectionViewC : SettingsCollectionView以及一个结构 OriginalDataC

tableView 第 5 行 - 包含通用内容

当我用OriginalDataA 初始化settingsCollectionViewA 时,我在CollectionView 中有一个setter,然后在LocalDataA 下设置本地数据。这使我能够确保我拥有基于用户进行更改等的数据的原始副本和工作副本。每当我从MainViewController 调用OriginalDataA 变量时,settingsCollectionViewA 中的 getter 都会进行一些清理数据等,然后我可以在MainViewController 中用它做我想做的事。

这部分一切正常,除非这些 tableView 单元格出列,当它们重新出现时,我会返回那个 tableViewCell 的原始状态,然后是 collectionView 而不是用户离开它的状态。

我意识到这是因为每个 SettingsCollectionView 类都在使用自己的 OriginalDataAOriginalDataB 等本地副本,我很感激我可以只更新 原始数据,但这会创建其他复杂性——比如为SettingsCollectionView 子类构建的当前“独立”代码的简洁性以及原始数据与更新数据的复杂性。这就是为什么我坚持使用更好的编程方法......

抱歉,这似乎是一个基本问题,但我对编程和所有示例等都是新手。我发现所有这些都涉及更简单的场景,而不是我正在尝试做的事情。

我没有包含代码,因为它有很多其他内容和功能,我认为这些内容和功能只会混淆上述概念。

任何帮助将不胜感激。

【问题讨论】:

  • 你的 originalDataA 是等结构还是类?
  • 它们是结构体
  • 如果它们是结构,您将需要您的视图控制器来保存工作副本以及原始副本,并通过委托或回调闭包更新工作副本。如果您创建数据类,那么您可以让视图控制器保存对工作副本实例的引用并将更新保存在单元格中。另一种可能更好的替代方法是创建一个类来保存您的工作副本结构并将此类实例传递给单元格
  • 谢谢。这就说得通了。我想我只是对如何更新说copyOfOriginalDataA感到困惑。如果我将它注入SettingsCollectionView,那么它不是整个SettingsCollecdtionView 中可用的变量,而只能在该方法中使用。所以试图在例如使用它numberOfItemsInSection 等让我很难过。我觉得我在这里遗漏了一些非常明显的东西!
  • @Paulw11 是正确的,您需要拥有 orignalData,即您将使用的 orignalData 的副本。当您的工作完成时,使用 copyOfOrignalData 更新 orignalCopy。如果您要添加/更新/重置数据,我认为您也应该转向类而不是结构

标签: ios swift uitableview uicollectionview


【解决方案1】:

创建一个包含每个数据结构的类:

class MyDataModel {
    var dataA: DataA
    var dataB: DataB
    var dataC: DataC
}

然后创建MyDataModel 的实例并在视图控制器的属性中保存对它的引用。将相同的实例传递给您的表格视图单元格。由于它是一个类,因此是一个引用类型,因此单元格所做的更改实际上将在这个实例中进行。

【讨论】:

    【解决方案2】:

    假设您有显示 originalDataASettingsCollectionViewA。 CollectionView 显示您在 cellforrowatindex 方法中提供的数据。集合视图单元每次都重用内存。在任何时间点,只有可见的细胞留在内存中。因此,除非您修改 originalDataA,否则不会显式存储用户修改的数据。

    【讨论】:

    • 这个答案基本上重申了原来的问题。它并没有真正提出解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多