以下最小代码通过按按钮切换详细信息的显示。
struct ContentView: View {
@State var showDetails: Bool = false
var body: some View {
VStack {
DetailsButton(showDetails: $showDetails) // 1
if showDetails {
Text("This is my message!")
}
}
}
}
struct DetailsButton: View {
@Binding var showDetails: Bool
var body: some View {
Button("\(showDetails ? "Hide" : "Show") Details") {
showDetails.toggle()
}
}
}
我想实现同样的目标,但是将
showDetails
属性移动到 ViewModel 中,我将其作为 环境变量:
(请注意,我使用的是 Swift 5.9 和 iOS 17 / macOS 14 的新观察框架。)
@Observable class ViewModel {
var showDetails: String?
}
一般我会在App类中初始化它:
struct TestApp: App {
@State var vm = ViewModel()
var body: some Scene {
WindowGroup {
ContentView()
.environment(vm)
}
}
}
并将 ViewModel 作为环境变量传递到 ContentView 中:
@Environment(ViewModel.self) private var vm
在这种情况下,如何像在原始示例中那样将
vm.showDetails
的绑定从 ContentView
传递到 DetailsButton
? (参见标有“1”的行)
您在 App 类中传递的环境变量将向下传递到视图层次结构。您可以简单地在
ViewModel
视图中使用 DetailsButton
作为环境变量
struct DetailsButton: View {
@Environment(ViewModel.self) private var vm
var body: some View {
Button("\(showDetails ? "Hide" : "Show") Details") {
vm.showDetails.toggle()
}
}
}