SwiftUI获取某些视图的EnvironmentValues,仅给出对该视图的引用

时间:2019-12-05 09:57:58

标签: swiftui swiftui-environment

根据我的理解,如果您自己定义视图(作为实现View的结构),则可以将某些var声明为环境变量,如下所示:

@Environment(\.isEnabled) var isEnabled

这将使您可以访问EnvironmentValues.isEnabled字段。

但是,这似乎只能在视图定义本身中实现。

在给定视图v的情况下,是否有可能获取该视图的环境对象?或获取特定的环境值?

1 个答案:

答案 0 :(得分:1)

我假设考虑到SwiftUI是反应式状态管理的框架,那么是的,您不能直接要求内部视图环境值,实际上是因为您不确定何时为该特定视图设置该环境。但是,当通过绑定明确地知道视图时,您可以要求该视图告诉您其内部状态。

如何执行此操作的示例代码(有点奇怪,但仅用于演示)如下所示。

struct SampleView: View {
    @Environment(\.isEnabled) private var isEnabled

    var myState: Binding<Bool>?

    var body: some View {
        VStack {
            Button(action: {}) { Text("I'm \(isEnabled ? "Enabled" : "Disabled")") }
            report()
        }
    }

    func report() -> some View {
        DispatchQueue.main.async {
            self.myState?.wrappedValue = self.isEnabled
        }
        return EmptyView()
    }
}

struct TestEnvironmentVar: View {

    @State private var isDisabled = false
    @State private var sampleState = true

    var body: some View {
        VStack {
            Button(action: {
                self.isDisabled.toggle()
            }) {
                Text("Toggle")
            }
            Divider()
            sampleView()
                .disabled(isDisabled)
        }
    }

    private func sampleView() -> some View {
        VStack {
            SampleView(myState: $sampleState)
            Text("Sample is \(sampleState ? "Enabled" : "Disabled")")
        }
    }
}


struct TestEnvironmentVar_Previews: PreviewProvider {
    static var previews: some View {
        TestEnvironmentVar()
    }
}