我正在将我的集合视图转换为新的iOS13 UICollectionViewDiffableDataSource ...因此我需要按需更新单元格信息。
下面是我的代码:
let snap = self.diffDataSouce.snapshot
snap?.reloadItems(withIdentifiers: [itemToUpdate]) //reload cell info
self.diffDataSouce.apply(snap, animatingDifferences: true)
但是我得到了Invalid parameter not satisfying: indexPath || ignoreInvalidItems
...为什么?我当前的snap
包含itemToUpdate
,也包含我的模型数组...
我认为这是因为snap.indexOfItemIdentifier(itemToUpdate)
返回未找到(NSNotFound)...但根据数据模型,这应该是不可能的。
你有什么提示吗?
5条答案
按热度按时间ljsrvy3e1#
您的数据模型必须符合
Hashable
和Equatable
,以便比较算法可以跟踪快照之间的更改。如果两个对象之间存在冲突问题,或者您已经以允许两个对象看起来等同于diff算法的方式实现了这两个协议中的任何一个,则您将获得运行时Assert异常。
我将准确地跟踪模型对象是如何继承或实现这些协议的。
jjhzyzn02#
对于我的情况,重新加载一个可散列项是个问题。相反,我应该删除可散列项并重新插入。以下是具体细节。
我的diffable
ItemIdentifierType
是AnyHash类型,如下所示:每当我想重新加载一个项目时,就像这个交换的作者一样,我就经历了崩溃:
我意识到,由于ItemIdentifierType是AnyHashable类型,如果一个项目的哈希值发生了变化,就不允许重新加载它,因为新项目的哈希值在当前快照中不存在,因此不能重新加载,相反,我应该从当前快照中删除旧项目,并插入新的Hashable标识符:
vyswwuz23#
您是否为您的模型实现了
static func ==
?我在使用结构体时遇到过类似的问题,其中所有属性之间的相等性都要计算35g0bw714#
尝试重新加载已从快照中删除的项时遇到此问题。这将导致相同或类似的错误。请确保数据模型和快照同步以避免此错误。
pdtvr36n5#
在我的例子中,我比较了两个不同类型的示例。