SwiftUI Slider通过EnvironmentObject响应TextField更新异常问题
解决SwiftUI Slider不响应TextField数值变更的问题
你的问题核心在于SliderView里的testNumber仅在视图首次加载时通过.onAppear同步了一次inputs.sampleNumber,但没有监听inputs.sampleNumber后续的变更。当你在InputView的TextField修改数值时,inputs.sampleNumber已更新,但testNumber未同步变化,导致滑块位置停留在初始状态。
只需给SliderView添加监听inputs.sampleNumber变化的.onChange修饰符,即可让滑块自动同步最新数值:
修改后的完整代码
// // SliderExample.swift // MapTests // // Created by Thomas Mead on 1/20/24. // import SwiftUI import Foundation struct SliderExample: View { @EnvironmentObject var inputs : Inputs var body: some View { Text("Hello, World!") VStack { InputView() SliderView() } } } struct InputView: View { @EnvironmentObject var inputs: Inputs var body: some View { HStack { Text("Sample Number") TextField("SampleNumber", value: $inputs.sampleNumber, format: .number) } } } struct SliderView: View { @EnvironmentObject var inputs: Inputs @State var testNumber = 1.0 var body: some View { HStack { Slider(value: $testNumber, in: 1...20.0, step: 1.0) .onChange(of: testNumber) { newValue in inputs.sampleNumber = Int(newValue) } .onAppear { testNumber = Double(inputs.sampleNumber) } // 新增监听:同步inputs的数值变更到滑块 .onChange(of: inputs.sampleNumber) { newValue in testNumber = Double(newValue) } Text("Sample \(Int(inputs.sampleNumber))") } } } // 移除多余的Observable继承,仅保留ObservableObject class Inputs: ObservableObject { init() {} @Published var sampleNumber: Int = 4 } // 预览注入EnvironmentObject,避免崩溃 #Preview { SliderExample() .environmentObject(Inputs()) }
关键修改点说明
- 给
Slider添加.onChange(of: inputs.sampleNumber),当共享数据sampleNumber变化时,自动更新滑块绑定的testNumber - 移除
Inputs类多余的Observable继承(仅需ObservableObject即可配合@Published实现响应式) - 预览中注入
EnvironmentObject,保证预览正常运行
修改后,拖动滑块或修改TextField数值时,两边会实时双向同步,滑块位置也会自动更新到对应数值。
内容的提问来源于stack exchange,提问作者ThomasMead
相关产品推荐
相关产品推荐

