当PhaseAnimator嵌套在带有 @Observable的 List中时,会导致AttributeGraph循环崩溃
我在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 而崩溃。
我已尝试过以下方法:
- 切换回
withAnimation和onAppear(这能解决问题,但我会失去基于阶段的逻辑)。 - 将
@Observable状态移动到父视图(没有任何变化)。 - 在
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)
}
}
}
}
有没有人找到把 PhaseAnimator 与 List 的编辑模式布局阶段解耦的方法?
解决方案
我不知道崩溃的原因,但还有关于 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。