SwiftUI报错:Cannot find '$model' in scope?环境对象传值问题
解决SwiftUI中@Environment对象无法生成Binding投影的问题
问题原因
当使用@Environment(Car.self)获取Observable对象时,该属性包装器不会像@State那样自动提供带$前缀的绑定投影,因此直接写$model.year会提示“Cannot find '$model' in scope”错误。
解决方案
以下是三种可行的解决方式,可根据项目场景选择:
方式1:手动创建Binding实例
直接通过Binding(get:set:)构造方法,基于环境对象的属性手动生成绑定:
struct CarView: View { @Environment(Car.self) var model: Car var body: some View { CarSubView(year: Binding( get: { model.year }, set: { model.year = $0 } )) } }
方式2:给Observable类添加绑定计算属性
在Car类中添加返回Binding<Int>的计算属性,后续直接调用该属性即可:
@Observable class Car { var year: Int init(year: Int) { self.year = year } // 添加绑定计算属性 var yearBinding: Binding<Int> { Binding( get: { self.year }, set: { self.year = $0 } ) } } // 在CarView中使用 struct CarView: View { @Environment(Car.self) var model: Car var body: some View { CarSubView(year: model.yearBinding) } }
方式3:使用@Bindable包装环境对象(SwiftUI 5+ / iOS 17+)
若项目基于iOS 17及以上版本,可通过@Bindable包装环境对象,实现类似@State的$前缀绑定投影:
struct CarView: View { @Bindable @Environment(Car.self) var model: Car var body: some View { CarSubView(year: $model.year) } }
说明
三种方式均可实现将year以Binding形式传递给子视图:方式3最简洁,但依赖较高版本的SwiftUI;方式1和2兼容性更好,适合低版本项目。
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

