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

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())
}

关键修改点说明

  1. 给Slider添加.onChange(of: inputs.sampleNumber),当共享数据sampleNumber变化时,自动更新滑块绑定的testNumber
  2. 移除Inputs类多余的Observable继承(仅需ObservableObject即可配合@Published实现响应式)
  3. 预览中注入EnvironmentObject,保证预览正常运行

修改后,拖动滑块或修改TextField数值时,两边会实时双向同步,滑块位置也会自动更新到对应数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:03:20