iOS13 DiffableDataSource无效参数不满足:indexPath || ignoreInvalidItems

时间:2019-11-25 10:36:09

标签: ios ios13 diffabledatasource nsdiffabledatasourcesnapshot

我正在将集合视图转换为新的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 个答案:

答案 0 :(得分:2)

您的数据模型必须符合scanf("%f",&sales)void showCommission() { float sales,commission; char consumeNewLine; const float COM_RATE=0.10; printf("Enter the amount of sales\n"); scanf("%f",&sales); scanf("%c",&consumeNewLine); commission=sales*COM_RATE; printf("The commission is $%f.\n",commission); } ,以便差异算法可以跟踪快照之间的变化。

如果两个对象之间存在冲突问题,或者您已经以允许两个对象看起来与差异算法相等的方式实现了这些协议中的任何一个,则将获得运行时断言异常。 / p>

我将精确地跟踪您的模型对象如何继承或实现那些协议。

答案 1 :(得分:1)

就我而言,问题是重新加载可哈希处理的项目。相反,我应该删除可哈希项并重新插入。具体如下。

我的可变量ItemIdentifierType具有AnyHashable类型,如下所示:

var dataSource: UICollectionViewDiffableDataSource<AHashableEnum, AnyHashable>!

每当我想重新加载单个项目(例如此交换的作者)时,我都遇到了崩溃:

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

我意识到,由于ItemIdentifierType为AnyHashable类型,因此如果其哈希值已更改,则不允许重新加载该项目。因为新项目的哈希值在当前快照中不存在,因此不可重新加载。相反,我应该从当前快照中删除旧项目,并插入新的Hashable identifer:

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

干杯!

答案 2 :(得分:1)

我不确定这是怎么回事。我使用类作为确认Hashable和Equatable协议的模型。

现在我首先尝试实现如下

    self.snapshot.appendSections(TodaysModel.arrayOfAllSection)
    //3.
    for section in TodaysModel.arrayOfAllSection {
        self.snapshot.appendItems(section.items, toSection: section)
    }
    //4.
    self.dataSource.apply(self.snapshot)

并且应用程序因错误而崩溃:由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“无效的参数不令人满意:部分!= NSNotFound” 以NSException类型的未捕获异常终止

现在花了三到四个小时之后,我确实实现了以下目标

    let allSection = TodaysModel.arrayOfAllSection
    self.snapshot.appendSections(allSection)
    //3. append rows in section
    allSection.forEach { section in
        self.snapshot.appendItems(section.items, toSection: section)
    }
    //4. apply to datasoruce
    self.dataSource.apply(self.snapshot)

现在,我可以看到我的所有UI,并且没有崩溃。不知道发生了什么事。请添加您的想法。如果我在第一种情况下做错了事,也要指导我。

答案 3 :(得分:0)

您是否为模型实现了static func ==?我在使用所有属性之间均等评估的结构时遇到了类似的问题

答案 4 :(得分:0)

我遇到了一个问题,我试图重新加载从快照中删除的项目。这将使您获得相同或相似的错误,请当心。