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

SwiftUI对象绑定值更新异常:UI未随状态变化刷新

问题修复方案

你的问题核心在于状态变化无法被SwiftUI监听,导致UI不更新。原因是FormData没有遵循ObservableObject协议,且内部的goals属性没有用@Published包装,无法将状态变化通知给视图。

修复步骤:

  1. 将FormData定义为遵循ObservableObject的类(ObservableObject仅支持类类型)
  2. 给FormData中的goals属性添加@Published包装器,让其变化能被SwiftUI监听
  3. 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:03:04