Swift中带Binding的视图模型与Toggle绑定失效如何解决?
问题原因分析
- 无法修改状态的核心原因:你给
isOn绑定初始赋值为.constant(false),constant类型的绑定是只读单向绑定,仅支持读取初始值,不支持写入修改,自然无法响应Toggle的切换操作。 - didSet从未触发的原因:
didSet监听的是Binding<Bool>这个结构体实例本身的赋值变化,只有你给isOn变量整个替换为新的Binding实例时才会触发。而Toggle修改的是Binding内部包装的Bool值,不会修改Binding实例本身,所以永远不会走didSet回调。
你当前的实现方案评估
你后续调整的实现是符合SwiftUI数据流规范的合理方案,优势如下:
- 视图模型协议继承
ObservableObject,视图层用@ObservedObject修饰视图模型实例,可以正确监听视图模型的状态变更,触发视图刷新。 - 手动构建Binding的get/set闭包,将绑定与底层私有存储属性
_isOn关联,set闭包中可以嵌入自定义业务逻辑,满足你额外的处理需求。 - 泛型视图的设计支持遵循
ViewModelProtocol的任意视图模型实现,非常适合依赖注入、单元测试场景下替换不同的视图模型实例,架构灵活性更高。
可选优化建议
如果你的_isOn属性除了给当前Toggle提供绑定外,还需要被其他业务逻辑或者视图监听,可以将私有存储属性改为@Published private var _isOn: Bool = false,这样修改_isOn时会自动触发ObservableObject的状态变更通知,所有依赖该属性的视图都会同步刷新,不影响现有绑定逻辑的运行。
内容的提问来源于stack exchange,提问作者Giel Berkers
相关产品推荐
相关产品推荐

