iOS13 DiffableDataSource无效参数不满足:索引路径||忽略无效项目

tct7dpnv  于 2023-01-03  发布在  iOS
关注(0)|答案(5)|浏览(153)

我正在将我的集合视图转换为新的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)...但根据数据模型,这应该是不可能的。
你有什么提示吗?

ljsrvy3e

ljsrvy3e1#

您的数据模型必须符合HashableEquatable,以便比较算法可以跟踪快照之间的更改。
如果两个对象之间存在冲突问题,或者您已经以允许两个对象看起来等同于diff算法的方式实现了这两个协议中的任何一个,则您将获得运行时Assert异常。
我将准确地跟踪模型对象是如何继承或实现这些协议的。

jjhzyzn0

jjhzyzn02#

对于我的情况,重新加载一个可散列项是个问题。相反,我应该删除可散列项并重新插入。以下是具体细节。
我的diffable ItemIdentifierType是AnyHash类型,如下所示:

var dataSource: UICollectionViewDiffableDataSource<AHashableEnum, AnyHashable>!

每当我想重新加载一个项目时,就像这个交换的作者一样,我就经历了崩溃:

var currentSnapshot = dataSource.snapshot()
currentSnapshot.reloadItems([hashableItemThatGotUpdated])
dataSource.apply(currentSnapshot, animatingDifferences: true)

我意识到,由于ItemIdentifierType是AnyHashable类型,如果一个项目的哈希值发生了变化,就不允许重新加载它,因为新项目的哈希值在当前快照中不存在,因此不能重新加载,相反,我应该从当前快照中删除旧项目,并插入新的Hashable标识符:

var currentSnapshot = dataSource.snapshot()
currentSnapshot.insertItems(identifiers: [NewHashableItemIdentifier], beforeItem: OldHashableItemIdentifier)
currentSnapshot.deleteItems(identifiers: [OldHashableItemIdentifier])
dataSource.apply(currentSnapshot, animatingDifferences: true)
vyswwuz2

vyswwuz23#

您是否为您的模型实现了static func ==?我在使用结构体时遇到过类似的问题,其中所有属性之间的相等性都要计算

35g0bw71

35g0bw714#

尝试重新加载已从快照中删除的项时遇到此问题。这将导致相同或类似的错误。请确保数据模型和快照同步以避免此错误。

pdtvr36n

pdtvr36n5#

在我的例子中,我比较了两个不同类型的示例。

public enum ChatSectionEnum: Hashable {

    case loading
    case messages(String)

    var sectionId: AnyHashable {
        switch self {
        case .loading:
            return UUID() // UUID type
        case .messages(let id):
            return id // String type
        }
    }

    public static func == (lhs: ChatSectionEnum, rhs: ChatSectionEnum) -> Bool {
        lhs.sectionId == rhs.sectionId // Error
    }

    public func hash(into hasher: inout Hasher) {
        hasher.combine(sectionId)
    }
}

相关问题