包含节和多个项目的IGListKit

时间:2017-03-09 16:24:32

标签: ios swift uicollectionview iglistkit

我试图用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 个答案:

答案 0 :(得分:1)

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

需要注意的另一点是,您使用self作为差异标识符,这意味着对象的实例标识其唯一性。这意味着永远不会比较两个DataSource个对象(obj.items.count == items.count永远不会发生)。不是一个交易破坏者,但只要知道它是如何表现的。

您还可以查看IGListBindingSectionController,其中包含原始模型,并将其分解为驱动该部分中每个单元格的视图模型。

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

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