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

SwiftUI中TextField更新ObservableObject变量后视图未同步问题咨询

问题分析与解决方案

当前实现方式不正确,问题根源在于自定义Shape作为值类型,没有正确关联到ObservableObject的发布属性,导致tiltAngle更新时,DrawPanels没有触发重绘,始终使用初始值绘制。

解决步骤:

  1. 确保Variables类的属性正确发布
    首先要保证tiltAngle是被@Published标记的发布属性,这样值变化时才能通知视图更新:

    class Variables: ObservableObject {
        @Published var tiltAngle: Double = 25.0
    }
    
  2. 让DrawPanels接收更新后的tiltAngle
    修改自定义Shape,将tiltAngle作为存储属性传入。因为Shape是值类型,只要传入的tiltAngle变化,SwiftUI会自动重新调用path(in:)方法重绘:

    struct DrawPanels: Shape {
        var tiltAngle: Double
    
        func path(in rect: CGRect) -> Path {
            // 这里编写依赖tiltAngle的绘制逻辑
            var path = Path()
            // 示例:根据倾斜角计算线条位置
            let radianAngle = tiltAngle * .pi / 180
            let offsetY = rect.height * sin(radianAngle)
            path.move(to: CGPoint(x: rect.minX, y: rect.minY))
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY + offsetY))
            return path
        }
    }
    
  3. 在父视图中正确传递tiltAngle
    在使用DrawPanels的父视图中,通过@StateObject或@ObservedObject持有Variables实例,直接将最新的tiltAngle传递给DrawPanels:

    struct ContentView: View {
        @StateObject var variables = Variables()
    
        var body: some View {
            VStack {
                TextField("倾斜角", value: $variables.tiltAngle, format: .number)
                    .padding()
                PanelSpacingView(tiltAngle: variables.tiltAngle)
                DrawPanels(tiltAngle: variables.tiltAngle)
                    .stroke(Color.gray, lineWidth: 2)
                    .frame(height: 200)
            }
        }
    }
    

可选优化:使用绑定传递

如果需要在DrawPanels内部修改tiltAngle,可以改用@Binding属性:

struct DrawPanels: Shape {
    @Binding var tiltAngle: Double

    // 绘制逻辑同上
}

父视图中传递绑定值:

DrawPanels(tiltAngle: $variables.tiltAngle)

内容的提问来源于stack exchange,提问作者Edward Hasted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:05:08