首页 经验

诗词速通,漫游泡泡,词汇宝,新维日语,简易物理,点此下载


【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” 警告。


正确做法

  1. 不要在 makeUIView 里修改 @State,而是用 @StateObject 或者普通类成员 来保存引用。

  2. 一个常见方案:

@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) {}
}

这样:


如果你想,我可以帮你写一个 完整可运行模板,保证:

你要我直接写吗?


还有问题,向AI提问。


上一个 【swiftui】MTKView 没有持有 Renderer 文章列表 下一个 【swiftui】黑屏意味着 Metal 渲染管线或 shader 逻辑还没输出颜色

(汉语/英语/日语/法语/德语)语音助手(识别/合成),智能翻译,高中物理动画,数据分析,数据可视化,电话: 18201798243(同v)

© 2019-至今 适观科技

沪ICP备17002269号