You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:05:04