iOS 17中@Observable环境对象无法用$语法绑定属性的问题排查
iOS 17 @Observable 环境对象绑定问题解答
这不是 Swift Bug,而是使用方式错误。
原因说明
通过 @Environment(MyType.self) 获取的 Observable 对象,SwiftUI 不会为其自动生成带 $ 前缀的投影绑定(这和 @State、@Bindable 等属性包装器的行为不同)。$myTypeObj 不存在于当前作用域,因此触发了报错。
正确解决方案
要为 Observable 环境对象的属性创建绑定,有两种常用实现方式:
方式一:手动构建 Binding 对象
通过 Binding(get:set:) 闭包手动实现属性的读写逻辑:
Picker("My Picker", selection: Binding( get: { myTypeObj.myProperty }, set: { myTypeObj.myProperty = $0 } )) { ForEach(1 ... 50, id: \.self) { num in Text("\(num)") } }
方式二:使用 @Bindable 包装环境对象
在视图中用 @Bindable 包装环境对象,即可通过 $ 前缀获取投影绑定并访问属性:
@Environment(MyType.self) private var myTypeObj @Bindable private var bindableMyType = myTypeObj // 将环境对象包装为可绑定实例 // 调用示例 Picker("My Picker", selection: $bindableMyType.myProperty) { ForEach(1 ... 50, id: \.self) { num in Text("\(num)") } }
内容的提问来源于stack exchange,提问作者Nicolas Gimelli
相关产品推荐
相关产品推荐

