0

我正在尝试使用 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)没有运气,因为它只刷新了我的数据源,而不是数据源中的项目。

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2017-03-19T21:09:43.923 回答