在另一个视图中更改时状态变量未更新

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。否则,当你处于各种视图中时,你可能会搞不清楚它在做什么。