SwiftUI:如何创建到环境对象属性的绑定?

问题描述 投票:0回答:1

以下最小代码通过按按钮切换详细信息的显示。

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”的行)

swiftui binding viewmodel swiftui-environment observation
1个回答
0
投票

您在 App 类中传递的环境变量将向下传递到视图层次结构。您可以简单地在

ViewModel
视图中使用
DetailsButton
作为环境变量

struct DetailsButton: View {

    @Environment(ViewModel.self) private var vm

    var body: some View {
        Button("\(showDetails ? "Hide" : "Show") Details") {
            vm.showDetails.toggle()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.