Append 部分在集合视图快照中的应用

问题描述 投票:0回答:1

我用不同的数据源制作了一个集合视图。快照定义为:

var snapshot = NSDiffableDataSourceSnapshot<Section, String>()

部分声明为:

struct Section:Hashable {
    let title: String
    let items: [String]
}

在视图控制器中:

 let sections = [Section(title: "morning", items: ["Item 1", "Item 2"]),
                        Section(title: "noon", items: ["Item 3", "Item 4"])]
        snapshot.appendSections(sections)
        for section in sections {
           snapshot.appendItems(section.items, toSection: section)
        }

我的问题是在视图控制器中该部分已经有项目,为什么我们必须再次使用appendItems(...) 附加项目才能使其工作。我尝试了苹果文档,但不太明白为什么。

swift uicollectionview uicollectionviewdiffabledatasource
1个回答
0
投票

您必须使用

appendItems
来“再次追加项目”,因为
appendSection
只是添加一个部分,而不是项目。

NSDiffableDataSourceSnapshot
的两个类型参数只是部分和项目的标识符。重要的是,部分标识符不需要包含该部分中的所有项目 - 它只是标识该部分的内容。您可以将其视为该部分的“名称”。

根据您的

Section
结构,我将使用
String
作为部分标识符:

var snapshot = NSDiffableDataSourceSnapshot<String, String>()

部分标识符可以是

title
Section

let sections = [...]
snapshot.appendSections(sections.map(\.title))
for section in sections {
    snapshot.appendItems(section.items, toSection: section.title)
}

虽然在技术上可以使用

Section
本身作为部分标识符(即,部分的“名称”是其
title
与其所有项目的组合),但大多数情况下这是不可取的。

当您

apply
快照时,这些标识符可帮助数据源确定要对哪些内容进行动画处理。 diffable 数据源可查找现有快照和您应用的新快照之间的差异。

如果您使用部分的项目作为部分标识符,这意味着每次添加/删除/更改项目时,该部分的标识符都会更改。这意味着具有旧标识符的部分被删除,并添加具有新标识符的新部分。数据源将动画删除整个部分,并在其位置插入新部分。

如果只有该部分的

title
是标识符,则数据源将知道该部分尚未更改,并且它只会为该特定项目的插入/删除/更改设置动画。虽然最终结果相同,但动画却截然不同。

© www.soinside.com 2019 - 2024. All rights reserved.