SwiftUI Toggle点击后状态不切换问题求助
问题原因及解决方案
核心问题
@State属性包装器仅能用于SwiftUI的View结构体内部,不能在普通类中使用,这会导致isEnabled的状态无法被SwiftUI正确管理,点击Toggle时状态不会更新。StoreableParam类未遵循ObservableObject协议,其内部属性变化无法通知视图刷新——即便storeParams数组被@Published修饰,数组内对象的属性变更也不会触发视图更新。
修改后的完整代码
import SwiftUI class StoreableParam: Identifiable, ObservableObject { let name: String var id: String { name } @Published var isEnabled: Bool let toggleAction: ((Bool) -> Void)? init(name: String, isEnabled: Bool, toggleAction: ((Bool) -> Void)? = nil) { self.name = name self.isEnabled = isEnabled self.toggleAction = toggleAction } } class StoreableParamViewModel: ObservableObject { @Published var storeParams: [StoreableParam] = [] init() { let storedParam = StoreableParam(name: "Stored Param", isEnabled: false) { value in print("Value changed to: \(value)") } storeParams.append(storedParam) } } public struct UBIStoreDebugView: View { @StateObject var viewModel: StoreableParamViewModel public var body: some View { VStack { List { ForEach(viewModel.storeParams) { param in ToggleView(param: param) } } } .navigationBarTitle("Toggle Example") } } // 单独封装Toggle视图,用于追踪单个参数的状态变化 struct ToggleView: View { @ObservedObject var param: StoreableParam var body: some View { Toggle(param.name, isOn: param.$isEnabled) .onChange(of: param.isEnabled) { newValue in param.toggleAction?(newValue) } } }
关键修改说明
- 让
StoreableParam遵循ObservableObject协议,并用@Published修饰isEnabled,这样属性变化会自动发送通知,触发视图更新。 - 将单个Toggle的逻辑封装到
ToggleView中,通过@ObservedObject绑定每个StoreableParam实例,确保其内部状态变化能被SwiftUI正确感知。 - 移除原代码中错误使用的
@State,替换为适合类类型的状态管理方案。
内容的提问来源于stack exchange,提问作者JonahGabriel
相关产品推荐
相关产品推荐

