重复指控:
这个问题被错误地标记为我提出的另一个问题的重复。这里的这个问题是关于在不完全重新加载它的情况下向单元格传达更改(动态更改其内容而不是交叉淡入淡出到新的),而另一个是关于从单元格(到视图控制器)传递信息的结构方式因为单元格的内容现在被抽象掉了。这是两件不同的事情,因此这个问题不是重复的!请重新打开它。但是,我确实意识到这个问题并不像应该的那样清楚,这可能促成了这一事实,所以我已经更新了它。
iOS 14 引入了一种UICollectionViews
通过 using 来处理和单元格的新方法UIContentConfiguration
,它保存了单元格的数据(事实来源)。它的构建使单元格在数据更改时自动刷新。但它通过将其交叉淡入到新的单元格来刷新整个单元格。如果您想更好地控制更新动画,例如当名称更改时您只想更新该标签而不是整个单元格,该怎么办?
让我们看一个例子:你有一个显示name
一个人和那个人的汽车的单元格。数据来自模型Person
并加载到单元格中。将模型传递给单元的最简单方法是通过ItemIdentifier
,例如:
struct Person {
var id: UUID
var name: String
var carName: String
}
...
enum Item {
case person(Person)
}
这样,无论何时Person
发生更改(例如carName
更改),您都可以将新快照应用于数据源并更新单元格。但是,此更新作为单元格的新旧版本之间的交叉淡入淡出动画进行。如果你不想要那个怎么办?如果您希望单元格仅对汽车名称进行动画处理,例如,不“动画化”整个单元格(也就是“让单元格动画化以适应新数据”),该怎么办?使用这种方法是不可能的。
因此,为了防止Person
更改重新加载整个单元格,您必须调整ItemIdentifier
以不包括整个Person
结构,而只包括其 id 或其他内容:
enum Item {
case person(UUID)
}
现在,只要 id 没有改变,cell 就不会重新加载,这是完美的,并且让 cell 有机会Person
自行更新更改。但是,你是怎么做的?显然,单元格现在需要Person
从其他地方获取数据,但是如何将更改传达Person
给该单元格?
这就是我要问的问题。
我最近发布了一个与此相关的问题。Combine
这是我在尝试使用发布者为单元提供更新来解决上述问题时遇到的“问题” :
NSDiffableSnapshot 导致 collectionview 的单元注册被重新调用,即使数据没有任何更改
(需要明确的是,这个问题也不是重复的。这是一个完全不同的问题,只是出于同一件事!)