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

Swift中如何在视图与嵌套类间传递并监听变量?

正确实现SwiftUI中嵌套ObservableObject的监听方法

要在View中监听Cls2内部变量的变化,核心是确保Cls2遵循ObservableObject协议,以下是具体实现步骤:

1. 定义Cls2并遵循ObservableObject

Cls2必须实现ObservableObject协议,并且要监听的变量用@Published标记:

class Cls2: ObservableObject {
    @Published var myVarFromCls2 = false
}

2. 定义Cls1

如果不需要替换Cls2的实例,Cls1里的cls2只需声明为普通属性即可;如果需要在替换Cls2实例时通知View,再给cls2加上@Published:

class Cls1: ObservableObject {
    @Published var myVarFromCls1 = false
    // 普通属性:仅监听Cls2内部变量变化
    var cls2 = Cls2()
    
    // 如果需要替换Cls2实例时触发View更新,改用@Published:
    // @Published var cls2 = Cls2()
}

3. 在View中访问并监听变量

在View中直接通过cls1.cls2.myVarFromCls2访问变量,SwiftUI会自动追踪Cls2的变化;如果需要双向绑定,使用$cls1.cls2.myVarFromCls2即可:

struct MyView: View {
    @ObservedObject var cls1 = Cls1()
    
    var body: some View {
        VStack(spacing: 20) {
            // 显示Cls2变量状态
            Text(cls1.cls2.myVarFromCls2 ? "Cls2变量已开启" : "Cls2变量已关闭")
            // 双向绑定切换Cls2变量
            Toggle("切换Cls2变量", isOn: $cls1.cls2.myVarFromCls2)
            
            Divider()
            
            // 原有的Cls1变量操作
            Text(cls1.myVarFromCls1 ? "Cls1变量已开启" : "Cls1变量已关闭")
            Toggle("切换Cls1变量", isOn: $cls1.myVarFromCls1)
        }
        .padding()
    }
}

问题原因说明

你之前的实现失败,大概率是Cls2没有遵循ObservableObject协议——SwiftUI只能识别遵循该协议的对象内的@Published变量变化,即使Cls1里的cls2标记了@Published,也无法监听未遵循协议的Cls2内部变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:00:54