随着为iOS 17引入的新的@Observable宏,我们现在可以通过以下方式使用环境对象

@Environment(MyType.self) var myTypeObj

现在,如果myTypeObj有一些属性,将其称为myProperty,我想使用$语法将其作为绑定传递到某个地方,SWIFT抱怨说它找不到变量.例如,

Picker("My Picker", selection: $myTypeObj.myProperty) { // we get an error on this line
  ForEach(1 ... 50, id: \.self) { num in
    ...
  }
}

我们收到一个错误,显示为Cannot find $myTypeObj in scope.这是Swift的漏洞,还是我做错了什么?

推荐答案

在iOS 17中,您必须使用Bindable.

@Observable
class AppState {
    var isOn: Bool = false
}

struct ContentView: View {
    
    @Environment(AppState.self) private var appState
    
    var body: some View {
        
        @Bindable var bindable = appState
        
        VStack {
            Toggle("Is On", isOn: $bindable.isOn)
        }
        .padding()
    }
}

#Preview {
    ContentView()
        .environment(AppState())
}

Swift相关问答推荐

如何避免使用DispatchSemaphores时线程爆炸?

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

如何防止自动状态恢复,如果应用程序被启动打开特定的文档?

如何在init()中使用setter/getters?

使用MKLocalSearch获取坐标

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

从`compactMap()`闭包返回`nil`未通过结果类型判断

Result类型的初始值设定项失败?

expose 不透明的底层类型

当模式以编程方式关闭时在父视图控制器中触发操作

我如何在 swift 中的 viewdidload 之前进行委托?

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

如何延迟 swift 属性 didSet 使其每秒只触发一次

如何测试可选 struct 的协议一致性

格式化大货币数字

Swift 根据总值将数组拆分为块

如何使用 Swinject 注册符合 ObservableObject 的协议?

从 Finder 打开文件时,SwiftUI 的应用程序(_ openFile:) 从未调用过

使用 Alamofire 4.0 (Swift 3) 下载文件

iOS 视图可见性消失了