我正在try 通过以下代码使用@Observable和@Environment来使用新的SWIFT宏:

import SwiftUI
import Observation

@Observable class NoteViewModel {
    var text = ""
}

struct ContentView: View {
    @State var note = NoteViewModel()
    
    var body: some View {
        FormView()
            .environment(note)
    }
}

struct FormView: View {
    @Environment(NoteViewModel.self) var note
    
    var body: some View {
        Form {
            TextField("write here", text: $note.text)
        }
    }
}

但是,它无法构建,并出现以下错误:

Cannot find '$note' in scope

删除$note中的$将导致:

Cannot convert value of type 'String' to expected argument type 'Binding<String>'

推荐答案

目前(从iOS 17/MacOS 15测试版2开始)通过@Environment对象接收的对象不能直接绑定.

解决方法(如WWDC休息室中的一位Apple工程师所建议的)是在您的body中重新声明一个可绑定的本地引用:

struct FormView: View {
    @Environment(NoteViewModel.self) var note
    
    var body: some View {
        @Bindable var note = note // add this line
        Form {
            TextField("write here", text: $note.text)
        }
    }
}

如果你对此感到沮丧,请务必向苹果提交反馈报告--我们对此类元素给他们的反馈越多,修复的优先级可能就越高.

Swift相关问答推荐

同步问题,发送Api Call之前未设置idToken

如何访问用户选定目录下的(只读)文件?

ClosedRange.Swift 中 Int 的索引?

SwiftUI 拖放:如果没有上下文类型,则无法解析对成员‘first’的引用

设备上ScrollView为什么会将内容高度更改为随机值,而在预览上不会? - 优化后的标题:设备上ScrollView内容高度随机变化问题解决

使用异步收集发布者值

SwiftUI:列表背景为空列表时为黑色

是否有一个带有空初始值设定项的 Swift 类/ struct 的标准协议

MainActor 隔离可变存储属性为何会出现可发送错误?

状态变量更改后,SwiftUI 视图不会更改

使用泛型的 Swift 枚举值

如何在 SwiftUI 中获取视图的位置

从 Swift 列表中的行中检索值

`let case(value)` 和 `case(let value)` 之间的区别 (Swift)

自定义选取器的出现导致其他视图重新排列

如何获取 NSRunningApplication 的参数?

在视图中设置所有变量

如何自己快速编写 Hashable 协议

获取设备图像比例(例如@1x、@2x 和@3x)

Swift :如何在一组字符之后得到所有东西