SwiftUI获取某些视图的环境值,只提供对该视图的引用

SwiftUI获取某些视图的环境值,只提供对该视图的引用,swiftui,swiftui-environment,Swiftui,Swiftui Environment,根据我的理解,如果您自己定义一个视图(作为实现view的结构),那么您可以将某个var声明为环境变量,如下所示: @Environment(\.isEnabled) var isEnabled 这将允许您访问环境值。isEnabled字段 但是,这似乎只有在视图定义本身中才可能实现 给定某个视图v,是否可以获取该视图的环境对象?或者获取特定的环境值?我假设考虑到SwiftUI是被动状态管理的框架,那么是的,您不能直接请求内部视图环境值,实际上是因为您无法确定该环境是何时为该特定视图设置的。然而

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

@Environment(\.isEnabled) var isEnabled
这将允许您访问
环境值。isEnabled
字段

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


给定某个视图
v
,是否可以获取该视图的环境对象?或者获取特定的环境值?

我假设考虑到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()
    }
}
struct SampleView:View{
@环境(\.isEnabled)私有变量isEnabled
var myState:绑定?
var body:一些观点{
VStack{
按钮(操作:{}){Text(“我\(已启用?:“已禁用”)}
报告()
}
}
func report()->某些视图{
DispatchQueue.main.async{
self.myState?.wrappedValue=self.isEnabled
}
返回空视图()
}
}
struct TestEnvironmentVar:View{
@国家私有var isDisabled=false
@状态私有变量sampleState=true
var body:一些观点{
VStack{
按钮(操作:{
self.isDisabled.toggle()
}) {
文本(“切换”)
}
分隔器()
sampleView()
.已禁用(已禁用)
}
}
private func sampleView()->一些视图{
VStack{
SampleView(myState:$sampleState)
文本(“样本为\(样本状态?“已启用”:“已禁用”))
}
}
}
结构测试环境变量预览:PreviewProvider{
静态var预览:一些视图{
TestEnvironmentVar()
}
}

不太清楚您想在哪里使用环境值。环境的定义是“从视图的环境中读取值的动态视图属性”。我相信它一定在视图内部,因为它是动态的,并且取决于视图的渲染方式。通过将它们与@Environment(\.KeyPath)绑定,我们可以将它们用作正则变量。你想存储一个特定的值并传递吗?@VictorSanchez有关这方面的背景信息,请参阅我的另一个问题: