SwiftUI对象绑定值更新异常:UI未随状态变化刷新
问题修复方案
你的问题核心在于状态变化无法被SwiftUI监听,导致UI不更新。原因是FormData没有遵循ObservableObject协议,且内部的goals属性没有用@Published包装,无法将状态变化通知给视图。
修复步骤:
- 将
FormData定义为遵循ObservableObject的类(ObservableObject仅支持类类型) - 给
FormData中的goals属性添加@Published包装器,让其变化能被SwiftUI监听 - 确保
Goals结构的属性修改会触发@Published的更新(因为结构体是值类型,修改其属性会生成新的实例)
完整修复代码:
import SwiftUI // 定义Goals结构体 struct Goals { var performance: Bool = false } // 修复FormData,使其遵循ObservableObject并添加@Published class FormData: ObservableObject { @Published var goals = Goals() } struct Test: View { @ObservedObject var formData = FormData() var body: some View { VStack { Text("Performance: \(String(formData.goals.performance))") Toggle(isOn: Binding( get: { formData.goals.performance }, set: { formData.goals.performance = $0 } )) { Text("Performance") } ChildWrapper(isPerformanceEnabled: $formData.goals.performance) } } } struct ChildWrapper: View { @Binding var isPerformanceEnabled: Bool var body: some View { VStack { Image(systemName: isPerformanceEnabled ? "circle.fill" : "circle") .font(.system(size: 50)) .foregroundColor(isPerformanceEnabled ? .green : .red) .onTapGesture { isPerformanceEnabled.toggle() } Text(isPerformanceEnabled ? "Enabled" : "Disabled") } } } struct Test_Previews: PreviewProvider { static var previews: some View { Test() } }
说明:
ObservableObject是SwiftUI中用于监听对象状态变化的协议,只有遵循该协议的类才能被@ObservedObject或@StateObject观察@Published包装器会自动为属性生成发布者,当属性值变化时,会通知所有观察该对象的视图刷新- 因为
Goals是结构体(值类型),修改其performance属性会创建一个新的Goals实例,触发@Published的更新通知
内容的提问来源于stack exchange,提问作者nickhealy
相关产品推荐
相关产品推荐

