swift 从视图的动态示例中提取数据

ukdjmx9f  于 12个月前  发布在  Swift
关注(0)|答案(1)|浏览(78)

我在整理一个应用程序供应商的数据输入表。为了保存时间并提高编码效率,我将许多更标准的布局放在它们自己的结构中,我称之为示例。问题是,我希望能够将人们在示例的文本字段部分中写下的内容:
1.将它们传递到一个屏幕上,该屏幕可以预览它们的信息对客户的显示效果
1.把它们放到数据库里
问题是我不知道如何引用变量,因为我相信因为它们都是相同结构的副本,所以文本字段具有相同的变量名。
这里有一个例子供参考:
下面是我创建的一个包含文本字段、标题和可选副标题的结构,称为DataFieldView()

struct DataFieldView: View {
    var title: String = ""
    var subtitle: String?
    var textEnterText: String = ""
    var dataVar: String = ""
    @State var changedText: Bool = false
    @State var enteredText: String = ""
    var body: some View {
        VStack(alignment: .leading) {
            Text(title)
                .font(.title2)
                .italic()
                .padding(.leading, 10)
            TextField(textEnterText, text: $enteredText)
                .padding()
                .frame(width: 350)
                .background(Color(red: 0.8, green: 0.8, blue: 0.8))
                .cornerRadius(10)
                .foregroundColor(.black)
                .font(.headline)
            if subtitle != nil {
                Text(subtitle!)
                    .font(.body)
                    .foregroundColor(Color(red: 0.3, green: 0.3, blue: 0.3))
                    .padding(.leading,10)
            }
            
        }
    }
}

下面是输入表单的一部分,其中包含了DataFieldView()的许多示例。

struct EntryView: View {
    @State var textFieldText: String = ""
    @State var genContShow: Bool = true

    var body: some View {
        ScrollView {                
            //MARK: General and Contacts
            VStack(alignment:.leading, spacing: 20) {
                Text("General and Contacts")
                    .font(.title)
                    .multilineTextAlignment(.leading)
                    .padding(.bottom, 15)
                if genContShow == true {

                    DataFieldView(title: "Name")
                    DataFieldView(title: "Email Address")
                    DataFieldView(title: "Address Line 1")
                    DataFieldView(title: "Address Line 2")
                    DataFieldView(title: "City")
                    DataFieldView(title: "State")
                    DataFieldView(title: "ZIP Code")
                        .padding(.bottom, 50)
                }
            }
        }
    }
}

我想把人们在DataFieldView()的每个示例的文本字段中键入的内容赋给他们自己的变量。但我却不知道该怎么称呼他们。
我尝试将这些示例传递到它们自己的变量中,但似乎不起作用。它只捕获文本字段第一次加载到屏幕上时的内容,很明显,因为它们是文本字段,所以我想在人们更新它们之后捕获其中的内容。

whhtz7ly

whhtz7ly1#

要从DataFieldView获取输入的数据,您需要使用Binding创建双向连接。您可以将enteredText变量更改为Binding类型(@Binding var enteredText: String)。然后,您需要在View EntryView中创建@State变量来存储输入的值。例如:

@State var name: String = ""
@State var email: String = ""
@State var address1: String = ""

// ... etc

并将这些值传递给DataFieldView的属性:

DataFieldView(title: "Name", enteredText: $name)
DataFieldView(title: "Email Address", enteredText: $email)
DataFieldView(title: "Address Line 1", enteredText: $address1)

您可以通过在每个DataFieldView下面添加文本视图来检查属性是否更新值,例如:

DataFieldView(title: "Name", enteredText: $name)
Text("\(name)")
DataFieldView(title: "Email Address", enteredText: $email)
Text("\(email)")
DataFieldView(title: "Address Line 1", enteredText: $address1)
Text("\(address1)")

相关问题