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

Ano*_*ude 3 ios swiftui

我想将变量从父视图传递到子视图,但在此子视图中,在文本字段中使用它,但仅在按下“保存”按钮时更新此值。

我试过这个:

父视图

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")
                }
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

子视图

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
    }        
}
Run Code Online (Sandbox Code Playgroud)

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

我不知道如何做我想做的事。

感谢您的帮助

New*_*Dev 7

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

因为子进程修改父进程拥有的数据,所以它需要接受绑定 - 而不是普通的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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,传入来自父级的绑定:

ChildView(name: $name)
Run Code Online (Sandbox Code Playgroud)

  • 几乎......你仍然需要 init 来从 `name` 中给出 `tempName` 初始值。 (2认同)