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