我正在尝试用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的家伙是否可以给我一些提示,什么是最好的实现来解决这个问题?
发布于 2017-03-20 05:09:44
您应该为每个对象返回截面控制器的唯一实例。不要重复使用它们!
另一件要注意的事情是,您使用self
作为diff标识符,这意味着对象的实例标识其唯一性。这意味着两个DataSource
对象永远不会被比较(obj.items.count == items.count
永远不会发生)。不是破坏交易,但要知道这就是它的行为方式。
您可能还想看看IGListBindingSectionController
,它获取原始模型并将其分解为视图模型,这些视图模型驱动部分中的每个单元。
更多详细信息和拉取请求中的示例。请注意,如果使用的是CocoaPods,则需要使用master。
https://stackoverflow.com/questions/42700448
复制相似问题