macOS Sequoia中SwiftUI List动画失效问题求助
macOS Sequoia下SwiftUI List动画失效问题
在macOS Sonoma系统中,我的SwiftUI代码里List在内容变更时能实现流畅动画:不管是用带可变谓词的@FetchRequest,还是通过Picker手动过滤。但升级到macOS Sequoia后,相同代码的List更新完全没有动画,内容直接切换到新状态,且该问题出现在两个完全独立的视图中。
视图1:由@FetchRequest驱动的List
@FetchRequest(fetchRequest: ..., animation: .default) private var items: FetchedResults<...> List(selection: $selection) { ForEach(items, id: \.self) { item in ... } } .onReceive(publisher.receive(on: DispatchQueue.main)) { condition in if condition { items.nsPredicate = somePredicate } else { items.nsPredicate = anotherPredicate } }
Sonoma中修改谓词会触发List的动画更新;但在Sequoia中,即使配置完全一致,List也会立即刷新,无任何过渡动画。
视图2:由Picker过滤控制的List
Picker(selection: $selection.animation()) { ForEach(...) { ... in ... } } label: { ... } List(..., selection: $selection) { ... in ... } .animation(.default, value: ...)
Sonoma中切换Picker选项会带动List变化的动画;但在Sequoia中,List内容直接跳转到新状态,无动画过渡。
注:这两个视图完全独立,数据源、逻辑和页面位置均不相同。
已尝试的无效解决方案
针对视图1,我尝试了以下方法,但都无法恢复动画:
- 给List添加
.animation(.default, value: items.count)和.animation(.default, value: items.map(\.objectID)),无效果 - 将ForEach的id参数改为
\.objectID或\.id,仍然没有动画 - 在
onReceive中用withAnimation包裹谓词修改代码,List还是立即更新,无动画
仍可正常工作的动画
意外的是,视图1中List的onMove(perform:)修饰符动画依然正常:
.onMove { ..., ... in Task { ... } }
核心疑问
macOS Sequoia是否有某些底层改动,导致以下场景下的List动画失效?
- 更新
@FetchRequest的谓词时 - 基于Picker选择重新计算过滤数据时
- 应用
animation(_:value:)修饰符或用withAnimation包裹更新操作时
两种实现方式在Sonoma中均正常,且我的模型都遵循Identifiable协议。
内容的提问来源于stack exchange,提问作者user10711707
相关产品推荐
相关产品推荐

