根据我的理解,如果你自己定义一个视图(作为一个实现的结构View
),那么你可以将一些 var 声明为环境变量,如下所示:
@Environment(\.isEnabled) var isEnabled
这将使您可以访问该EnvironmentValues.isEnabled
字段。
但是,这似乎只能在视图定义本身内实现。
给定一些视图v
,是否有可能获取该视图的环境对象?或获得特定的环境值?
根据我的理解,如果你自己定义一个视图(作为一个实现的结构View
),那么你可以将一些 var 声明为环境变量,如下所示:
@Environment(\.isEnabled) var isEnabled
这将使您可以访问该EnvironmentValues.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()
}
}