具有部分和多个项目的 IGListKit

Posted

技术标签:

【中文标题】具有部分和多个项目的 IGListKit【英文标题】:IGListKit with sections and multiple items 【发布时间】:2017-03-09 16:24:31 【问题描述】:

我正在尝试使用 IGListKit 实现集合视图。它可以有一个或三个部分。数据源是实时填充的,因此需要在有新数据时刷新内容。

为此,我创建了一个符合 IGListDiffable 的数据源对象,它代表每个部分:

final class DataSource: NSObject 
  var title: String?
  var items: [SJResult] = []


extension DataSource: IGListDiffable 
  public func diffIdentifier() -> NSObjectProtocol 
    return self
  

  public func isEqual(toDiffableObject object: IGListDiffable?) -> Bool 
    if object === self 
      return true
    
    guard let obj = object as? DataSource else 
      return false
    
    return obj.items.count == items.count
  

在每个部分中,我想显示items 的列表。我已经设法通过重用相同的部分控制器来创建部分,但我发现插入新结果的唯一方法是在适配器上调用reloadData()。这很糟糕,因为它会重新加载完整的项目列表(可能很长,> 50 个项目)。它也不可能为新项目的插入设置动画。我也尝试过adapter.performUpdates(animated: true),但没有成功,因为它只刷新了我的数据源,而不是数据源中的项目。

然后我尝试创建一个部分控制器,它将用一个单元格显示每个部分。该单元格将包含一个IGListCollectionView 并将负责显示items,但是我没有运气,尽管第二部分控制器接收到它从未显示单元格的对象。

我现在有点挣扎,不知道如何通过使部分静态和项目动态显示三个使用 IGListKit 相同类型单元格的不同部分。我正在考虑创建三个 IGListCollectionView 并在它们之间设置底部/顶部约束,但我对这样做的可能性有些怀疑。

我想知道是否有人已经遇到过类似的问题和/或来自 IGListKit 的人是否可以给我一些提示,告诉我解决该问题的最佳实施方式是什么?

【问题讨论】:

【参考方案1】:

您应该为每个对象返回您的部分控制器的唯一实例。不要重复使用它们!

另外需要注意的是,您使用self 作为差异标识符,这意味着对象的实例标识了它的唯一性。这意味着永远不会比较两个 DataSource 对象(obj.items.count == items.count 永远不会发生)。不会破坏交易,但请注意它的行为方式。

您可能还想查看IGListBindingSectionController,它采用您的原始模型并将其分解为驱动该部分中每个单元格的视图模型。

拉取请求中的更多详细信息和示例。请注意,如果您使用的是 CocoaPods,则需要使用 master。

https://github.com/Instagram/IGListKit/pull/494

【讨论】:

以上是关于具有部分和多个项目的 IGListKit的主要内容,如果未能解决你的问题,请参考以下文章

如何为具有共享代码库的多个项目正确设置 git?

具有共享库的多个项目/解决方案的源代码控制

设置具有多个部分和按钮的 tableviewcontroller

快速具有多个部分和多行的表格视图

UITableView 具有多个具有多行的部分。我需要部分独立运行

具有多个单元格的 Collectionview 和 diffable 部分