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

