为什么我的@State变量似乎自动重置为其初始值?

  • 本文关键字:@State 变量 swift swiftui
  • 更新时间 :
  • 英文 :


当我试图通过.sheet(isPresented:)视图修饰符呈现View时,我为isPresented:使用的@State布尔变量只需要设置为true以使表正确显示和消失,这使我感到困惑。我假设我必须将@State变量手动设置为truefalse,但在我通过点击离开工作表后,它似乎会自动返回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()
}
}
}
}
}
}

你可以自己测试这两个例子,看看状态何时以及如何改变。

相关内容

  • 没有找到相关文章

最新更新