在另一个视图中更改时状态变量未更新
State variable not updated when changed in another View
我想更好地理解跨视图绑定数据,所以我制作了这个演示应用程序
First View - 如果 isShowing 为真,导航至 SecondView(绑定 value)
struct ParentView: View {
@State var isShowing = false
@State var value = 5
var body: some View {
NavigationView {
if value != 5 {
ThirdView(isShowing: $isShowing)
} else {
NavigationLink(isActive: $isShowing) {
SecondView(value: $value)
} label: {
Text("Go to second view")
}
}
}
}
}
第二个视图 - 更新 ParentView 值
struct SecondView: View {
@Binding var value: Int
@Environment(\.presentationMode) private var presentationMode
var body: some View {
VStack {
Button {
value = 5
presentationMode.wrappedValue.dismiss()
} label: {
Text("Return 5")
}
Button {
value = 1
presentationMode.wrappedValue.dismiss()
} label: {
Text("Return 1")
}
}
}
}
ThirdView - 在 FirstView 中显示,以防 value 不是 5
struct ThirdView: View {
@Binding var isShowing: Bool
var body: some View {
ZStack {
Button {
isShowing.toggle()
} label: {
Text("Its a problem... Go to second view")
}
}
}
}
我试图在 ThirdView 中切换 isShowing 以便它可以打开 SecondView 来更新 值再一次。
但是当在 ThirdView 中单击按钮时,它不会执行任何操作。
您的设置方式不会改变。 value != 5
时,视图中不存在您的`NavigationLink。相反,您想像这样以编程方式触发它:
struct ParentView: View {
@State var isShowing = false
@State var value = 5
var body: some View {
NavigationView {
VStack {
Text(value.description)
if value != 5 {
ThirdView(isShowing: $isShowing)
} else {
// Change out the NavigationLink for a button that sets isShowing.
Button {
isShowing = true
} label: {
Text("Go to second view")
}
}
}
// By placing it in the background, it is always available to be triggered.
.background(
NavigationLink(isActive: $isShowing) {
SecondView(value: $value)
} label: {
EmptyView()
}
)
}
}
}
最后,您不需要在 ThirdView
中切换 isShowing
。您最好关闭视图或将值设置为 false
。否则,当你处于各种视图中时,你可能会搞不清楚它在做什么。
我想更好地理解跨视图绑定数据,所以我制作了这个演示应用程序
First View - 如果 isShowing 为真,导航至 SecondView(绑定 value)
struct ParentView: View {
@State var isShowing = false
@State var value = 5
var body: some View {
NavigationView {
if value != 5 {
ThirdView(isShowing: $isShowing)
} else {
NavigationLink(isActive: $isShowing) {
SecondView(value: $value)
} label: {
Text("Go to second view")
}
}
}
}
}
第二个视图 - 更新 ParentView 值
struct SecondView: View {
@Binding var value: Int
@Environment(\.presentationMode) private var presentationMode
var body: some View {
VStack {
Button {
value = 5
presentationMode.wrappedValue.dismiss()
} label: {
Text("Return 5")
}
Button {
value = 1
presentationMode.wrappedValue.dismiss()
} label: {
Text("Return 1")
}
}
}
}
ThirdView - 在 FirstView 中显示,以防 value 不是 5
struct ThirdView: View {
@Binding var isShowing: Bool
var body: some View {
ZStack {
Button {
isShowing.toggle()
} label: {
Text("Its a problem... Go to second view")
}
}
}
}
我试图在 ThirdView 中切换 isShowing 以便它可以打开 SecondView 来更新 值再一次。
但是当在 ThirdView 中单击按钮时,它不会执行任何操作。
您的设置方式不会改变。 value != 5
时,视图中不存在您的`NavigationLink。相反,您想像这样以编程方式触发它:
struct ParentView: View {
@State var isShowing = false
@State var value = 5
var body: some View {
NavigationView {
VStack {
Text(value.description)
if value != 5 {
ThirdView(isShowing: $isShowing)
} else {
// Change out the NavigationLink for a button that sets isShowing.
Button {
isShowing = true
} label: {
Text("Go to second view")
}
}
}
// By placing it in the background, it is always available to be triggered.
.background(
NavigationLink(isActive: $isShowing) {
SecondView(value: $value)
} label: {
EmptyView()
}
)
}
}
}
最后,您不需要在 ThirdView
中切换 isShowing
。您最好关闭视图或将值设置为 false
。否则,当你处于各种视图中时,你可能会搞不清楚它在做什么。