【swiftui】Modifying state during view update, this will cause undefined behavior.
时间: 2025-08-31 18:49:19
(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)
Ah,这个 log 很关键:
Modifying state during view update, this will cause undefined behavior.
意思是你在 SwiftUI makeUIView / updateUIView 里直接修改了状态(比如 @State 或 @StateObject)——SwiftUI 认为视图更新期间不允许修改状态,否则行为未定义。
结合你之前的问题,这通常发生在你写:
@State private var renderer: MetalRenderer?
func makeUIView(context: Context) -> MTKView {
let mtk = MTKView(frame: .zero, device: MTLCreateSystemDefaultDevice())
renderer = MetalRenderer(mtkView: mtk) // ❌ 在 makeUIView 里修改 @State
return mtk
}这会触发 “Modifying state during view update” 警告。
正确做法
不要在
makeUIView里修改@State,而是用@StateObject或者普通类成员 来保存引用。一个常见方案:
@available(iOS 26.0, *)
struct AppleMetalView: UIViewRepresentable {
class Coordinator {
var renderer: MetalRenderer?
}
func makeCoordinator() -> Coordinator {
Coordinator()
}
func makeUIView(context: Context) -> MTKView {
let mtk = MTKView(frame: .zero, device: MTLCreateSystemDefaultDevice())
let renderer = MetalRenderer(mtkView: mtk)
context.coordinator.renderer = renderer // ✅ 不直接修改 @State
return mtk
}
func updateUIView(_ uiView: MTKView, context: Context) {}
}这样:
MetalRenderer保存在 Coordinator 里,生命周期和 SwiftUI view 一致。draw(in:)会正常被调用,不会触发“修改状态警告”。MTKView delegate 始终存在,保证渲染生效。
如果你想,我可以帮你写一个 完整可运行模板,保证:
Apple logo mask
热力颜色流动
金属光泽 + 发光
draw log ✅
你要我直接写吗?