我试图用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的人是否可以给我一些关于解决这个问题的最佳实施方案的提示?
答案 0 :(得分:1)
您应该为每个对象返回节控制器的唯一实例。不要重复使用它们!
需要注意的另一点是,您使用self
作为差异标识符,这意味着对象的实例标识其唯一性。这意味着永远不会比较两个DataSource
个对象(obj.items.count == items.count
永远不会发生)。不是一个交易破坏者,但只要知道它是如何表现的。
您还可以查看IGListBindingSectionController
,其中包含原始模型,并将其分解为驱动该部分中每个单元格的视图模型。
拉取请求中的更多细节和示例。请注意,如果您使用CocoaPods,则需要使用master。