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

Swift Observation框架下SwiftUI视图重绘异常排查

问题:SwiftUI中TextField修改后Text无法同步更新

在SwiftUI开发界面时遇到如下问题:

  • 版本1代码中,修改TextField内容时,页面上的Text会同步更新
  • 版本2代码中,Text无法同步更新,仅在重新进入页面时才会更新(修改TextField不会触发视图重绘)

代码示例

Version 1

@Bindable var palette: Palette

Text(palette.name)
TextField("name", text: $palette.name)

Version 2

@Bindable var store: PaletteStore
var index: Int

Text(store.palettes[index].name)
TextField("name", text: $store.palettes[index].name)

模型定义

Palette

@Observable class Palette {
    var name: String
    ...
}

PaletteStore

@Observable class PaletteStore {
    var palettes: [Palette]
    ...
}

曾在网上查找Observation相关资料,但相关资源较少。


更新:已找到问题原因及解决方案

原代码中palettes是计算属性,未依赖任何存储属性,因此Observation机制无法追踪其修改。可参考WWDC2023的演示方案,在计算属性中手动触发视图重绘:

@Observable class Donut {
  var name: String {
    get {
      access(keyPath: \.name)
      return someNonObservableLocation.name 
    }
    set {
      withMutation(keyPath: \.name) {
        someNonObservableLocation.name = newValue
      }
    }
  } 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:59:55