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 的人是否可以给我一些提示,说明解决这个问题的最佳实施方式是什么?

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

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

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

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

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

最新更新