SwiftUI中TextField更新ObservableObject变量后视图未同步问题咨询
问题分析与解决方案
当前实现方式不正确,问题根源在于自定义Shape作为值类型,没有正确关联到ObservableObject的发布属性,导致tiltAngle更新时,DrawPanels没有触发重绘,始终使用初始值绘制。
解决步骤:
确保
Variables类的属性正确发布
首先要保证tiltAngle是被@Published标记的发布属性,这样值变化时才能通知视图更新:class Variables: ObservableObject { @Published var tiltAngle: Double = 25.0 }让
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 } }在父视图中正确传递
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
相关产品推荐
相关产品推荐

