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
相关产品推荐
相关产品推荐

