当我试图通过.sheet(isPresented:)
视图修饰符呈现View
时,我为isPresented:
使用的@State
布尔变量只需要设置为true
以使表正确显示和消失,这使我感到困惑。我假设我必须将@State
变量手动设置为true
和false
,但在我通过点击离开工作表后,它似乎会自动返回false
。
例如(你可以看到managing
初始化为false
):
@State private var managing = false
var body: some View {
HStack {
SomeViews()
}
.sheet(isPresented: $managing) {
Manager()
}
}
然后我在其他地方有一些Button
控制managing
变量:
Button {
managing = true
} label: {
SomeLabel()
}
下面是一个完整的例子:
import SwiftUI
struct TestView: View {
@State private var managing = false
var body: some View {
VStack {
Button {
managing = true
} label: {
Image(systemName: "plus.circle")
}
Text("Hello, World!")
}
.sheet(isPresented: $managing) {
Text("Manager")
}
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
为什么我只需要设置managing
变量为true
的工作表?
如果没有传递default -nilonDismiss:
参数到.sheet(isPresented:)
,视图修饰符是否会自动切换在Binding
中传递的参数?
编辑:似乎即使在传递onDismiss:
闭包时,工作表也会正确地解散。
SwiftUI sheets/modals管理自动切换的状态。您可以通过添加.onChange
修饰符自己看到这一点。
struct ContentView: View {
@State private var toggle = false
var body: some View {
Button("Toggle Me") {
self.toggle = true
}
.sheet(isPresented: self.$toggle, content: { Sheet() })
.onChange(of: self.toggle) { newValue in
print(newValue)
}
}
}
其中Sheet()
只是一些文本:
struct Sheet: View {
var body: some View {
Text("sheet")
}
}
当你解散工作表时,通过在iOS上下拉或在ipad上点击外部,你可以观察到当工作表完全解散时,toggle
状态将被设置为false。
此外,如果您选择通过工具栏按钮解除工作表,例如通过dismiss
环境变量,它还将正确地管理您的初始状态:
struct Sheet: View {
@Environment(.dismiss) private var dismiss
var body: some View {
NavigationView {
Text("sheet")
.toolbar {
ToolbarItemGroup(placement: .navigationBarTrailing) {
Button("Done") {
dismiss()
}
}
}
}
}
}
你可以自己测试这两个例子,看看状态何时以及如何改变。