当我在 ScrollView 上使用
.animation(.spring(), value: favoriteArticles)
来启用删除或添加项目的动画时。 favoriteArticles
是从CoreData获取的数据。
然后我得到了这个错误
Instance method 'animation(_:value:)' requires that 'FetchedResults<Article>' conform to 'Equatable'
,我怎样才能让CoreData对象确认Equatable协议。
Section {
ScrollView(.vertical, showsIndicators: false) {
ForEach(favoriteArticles) { article in
favoriteArticleRow(article: article)
}
}
.padding(.horizontal, 16)
.padding(.top, 14)
.confirmationDialog("This favorite will be deleted.", isPresented: $showDeleteOneAlert, titleVisibility: .visible) {
Button("Delete", role: .destructive) {
print("~ delete \(String(describing: selectedFavorite?.text))")
guard let selectedFavorite = selectedFavorite else { return }
delete(article: selectedFavorite)
// If favorites is empty, show control panel, and reset showDeleteButton
if favoriteArticles.isEmpty {
showDeleteButton.toggle()
homeViewState.showControlPanel.toggle()
}
}
}
.animation(.spring(), value: favoriteArticles)
CoreData 对象是
NSObject
,其中 do 符合 Equatable
。不符合FetchedResult
的是
Equatable
。
如果您只想以动画方式添加和删除最喜欢的文章,则可以使用
favoriteArticles.count
作为 value:
参数。这是假设在每笔交易中,仅添加或仅删除收藏的文章。
如果在同一笔交易中一篇文章可以被收藏,而另一篇文章则未被收藏,则交易不会被动画化。
favoriteArticles.count
毕竟没有改变。为了处理这个问题,您需要将所有获取的结果加载到内存中并比较它们的 id。例如favoriteArticles.map(\.objectID)
。这可能会很昂贵,具体取决于有多少收藏的文章。
或者,如果您知道某篇文章何时会被收藏(取消)收藏,请用
withAnimation
括起来。