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

SwiftUI中@Published属性能否作为@Binding传递给其他视图?

问题原因解析

核心差异:@Binding与@ObservedObject的工作机制不同

  1. @Published的本质
    @Published是给ObservableObject类的属性添加「值变化发布能力」:当属性的值(对于值类型)或引用(对于引用类型)发生改变时,会触发ObservableObject实例的objectWillChange事件,通知所有监听该实例的视图刷新。

  2. 传递@Binding时UI不更新的原因

    • 当你把$viewModel.filterSelection作为@Binding传给子视图时,子视图仅获得了该属性的双向读写权限,但没有订阅ViewModel的objectWillChange事件。
    • 如果filterSelection是值类型:修改Binding的值会触发ViewModel的objectWillChange,持有ViewModel作为@ObservedObject的父视图会刷新,但如果父视图的body没有明确依赖filterSelection,SwiftUI可能会优化掉子视图的重新渲染,导致子视图UI不更新。
    • 如果filterSelection是引用类型:修改其内部属性不会触发ViewModel的@Published通知(因为@Published只监听属性本身的引用变化,而非内部属性),此时父视图和子视图都不会收到刷新通知,UI自然无变化。
  3. 传递整个ViewModel时UI更新正常的原因
    当子视图以@ObservedObject接收整个ViewModel时,会自动订阅ViewModel的objectWillChange事件:

    • 无论filterSelection是值类型还是引用类型(只要修改时触发了@Published的通知,比如给引用类型赋值新实例),子视图都会收到刷新信号,重新计算body并更新UI。
    • 如果filterSelection本身也是ObservableObject,子视图中直接访问其内部@Published属性时,还能额外监听filterSelection的变化,进一步保证UI同步。

总结

@Binding仅负责值的双向传递,不具备监听ObservableObject全局变化的能力;而@ObservedObject会全程订阅ViewModel的所有@Published属性变化,确保视图能及时响应更新。

内容的提问来源于stack exchange,提问作者Qazi Ammar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:03:34