当PhaseAnimator嵌套在带有 @Observable的 List中时,会导致AttributeGraph循环崩溃

移动开发 2026-07-09

我在iOS 19.2(Xcode 17.1)遇到了一个非常具体的运行时崩溃,我在任何文档中都没看到过相关记录。

我有一个 List,每一行都使用新的 @Observable 宏作为它的视图模型。

在这一行中,我使用 phaseAnimator 来让一个图标持续脉动。

在我执行滑动删除一行或重新排序列表之前,一切都运行正常。

错误:

=== AttributeGraph: cycle detected through attribute 124832 ===
CoreAnimation: [Warning] Aggregated stats for Animation ID 42: { ... }
(lldb)

应用会冻结一秒钟,然后在 AttributeGraph 私有框架中因为 EXC_BAD_ACCESS 而崩溃。

我已尝试过以下方法:

  1. 切换回 withAnimationonAppear(这能解决问题,但我会失去基于阶段的逻辑)。
  2. @Observable 状态移动到父视图(没有任何变化)。
  3. PhaseAnimator 上使用 .id(UUID())(可以阻止崩溃,但会导致大范围的闪烁)。

看起来List的滑动操作在布局阶段与动画器的更新循环发生冲突,导致依赖图中出现无限循环。

struct TaskRow: View {
    @Bindable var viewModel: TaskItem // @Observable class

    var body: some View {
        HStack {
            Text(viewModel.title)
            Spacer()
            Image(systemName: "clock.fill")
                .phaseAnimator([0.5, 1.0], trigger: viewModel.isOverdue) { content, phase in
                    content.opacity(phase)
                }
        }
    }
}

有没有人找到把 PhaseAnimatorList 的编辑模式布局阶段解耦的方法?

解决方案

我不知道崩溃的原因,但还有关于 PhaseAnimator 的崩溃报告,参见 使用PhaseAnimator关闭SwiftUI视图导致应用崩溃(包括评论区的讨论)。

作为变通方案,你可以考虑改用 .symbolEffect(.pulse)

struct ContentView: View {
    @State private var isOverdue = false

    var body: some View {
        Image(systemName: "clock.fill")
            .font(.largeTitle)
            .foregroundStyle(isOverdue ? .red : .green)
            .symbolEffect(.pulse, isActive: isOverdue)
            .onTapGesture { isOverdue.toggle() }
    }
}

动画

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章