SwiftUI:仅在需要时如何更新从父视图传递的变量?

问题描述

我想将变量从父级传递到子级视图,但是在此子级视图中,请在文本字段中使用该变量,但仅在按下SAVE按钮时才更新此值。

我尝试过:

ParentView

struct ParentView: View {
    @State private var name: String = ""
    
    var body: some View {
        HStack {
            Text("User name: \(name)")
            Spacer()
            NavigationLink(
                destination: ChildView(name: name),label: {
                    Text("Update name")
                }
            )
        }
    }
}

ChildView

struct ChildView: View {
    @State private var name: String = ""
    @Binding var passedname: String
    
    var body: some View {
        vstack {
            Form {
                TextField("Update name",text: $name)
                Button(action: {
                    passedname = name
                },label: {
                    Text("SAVE")
                })
            }
        }
    }
    
    init(name: String) {
        self._passedname = .constant(name)
        self.name = name
    }        
}

由于我不想直接更新变量,因此我尝试使用name值,然后仅在轻按“确定”按钮时设置绑定的passedname的值。但这不起作用。

我不知道该怎么做。

感谢您的帮助

解决方法

您的一般方法是正确的-具有一个状态变量来表示临时键入的名称,但是有一个绑定来表示名称“返回”给父级。

由于子级修改了父级拥有的数据,因此需要接受绑定-而不是简单的for item in data["people1"]: if item["name"] == "William": print(item["age"]) print(item["location"])

String

然后,传递父级的绑定:

struct ChildView: View {
    @State private var name: String
    @Binding var passedName: String
    
    var body: some View {
        VStack {
            Form {
                TextField("Update name",text: $name)
                Button(action: {
                    passedName = name
                },label: {
                    Text("SAVE")
                })
            }
        }
    }

    init(name: Binding<String>) {
        self._passedName = name
        self._name = State(initialValue: name.wrappedValue)
    }
}