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

SwiftUI中@State变量属性变更后UI不更新问题求助

问题原因分析

你的问题核心在于**@State 类型的 EventDisplayModel 无法感知原始 Event 对象的变化**:

  • EventDisplayModel 是在 EventsListView 初始化时基于当时的 Event 数据创建的,属于视图内部的独立状态。当你在 EventDetailsView 中修改了 Event 的媒体状态后,虽然原始 Event 和数据管理器已经更新,但 EventsListView 里的 EventDisplayModel 并没有自动同步这些变化——因为 @State 是值类型(如果是 struct)的话,它的更新需要显式赋值才能触发 UI 刷新,而你没有在 Event 变化时更新这个 @State 对象。
  • 如果 Event 是引用类型(class),但 EventDisplayModel 是值类型,它存储的是当时媒体数量等数据的拷贝,原始 Event 的变化不会自动同步到这个拷贝里,自然不会触发列表 UI 更新。
解决方案建议

不用弃用 EventDisplayModel,而是调整它的依赖方式,避免用 @State 单独持有:

  • 让 EventDisplayModel 依赖 @ObservedObject 的 Event:把 Event 作为 @ObservedObject 传入 EventsListView,然后 EventDisplayModel 可以设计成基于 Event 的计算属性,或者内部持有 Event 的引用并监听其变化(前提是 Event 本身是 ObservableObject,媒体状态用 @Published 标记)。这样当 Event 的媒体状态变化时,EventDisplayModel 会自动同步数据,进而触发 EventsListView 的 UI 更新。
  • 将 EventDisplayModel 改为 ObservableObject:如果需要在 EventDisplayModel 里处理额外的展示逻辑(比如缩略图加载状态),可以把它定义成 ObservableObject,内部持有 Event 的引用作为 @ObservedObject,这样 Event 的变化会传递给 EventDisplayModel,再由它触发视图刷新。

这种方式既保留了 EventDisplayModel 封装展示逻辑的优势,又能保证数据变化时 UI 自动同步,不会因为后续功能扩展导致状态管理混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:25:04