Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 如何使用ForEach从数组创建文本字段?_Swiftui - Fatal编程技术网

Swiftui 如何使用ForEach从数组创建文本字段?

Swiftui 如何使用ForEach从数组创建文本字段?,swiftui,Swiftui,我想从字段数组构造一个表单 class Field : Identifiable { let id = UUID() var label : String var value : String init(label: String, value: String) { self.label = label self.value = value } } 我试图在视图中使用ForEach迭代器 struct ContentVi

我想从字段数组构造一个表单

class Field : Identifiable {
    let id = UUID()
    var label : String
    var value : String

    init(label: String, value: String) {
        self.label = label
        self.value = value
    }
}
我试图在视图中使用
ForEach
迭代器

struct ContentView: View {
    @EnvironmentObject var app: App
        
    var body: some View {
        Form {
            ForEach(app.fields) { field in
                HStack {
                    Button(action: { self.app.update(label: field.label) } ) {Text(field.label)}
                    TextField("0", text: field.value)  // error
                }
            }
        }
    }
}
此代码导致错误消息
无法将类型为“String”的值转换为预期的参数类型“Binding”
,我试图将
字段.值
传递到
文本字段()

我无法找到一种方法来创建一个
绑定
以传递到
TextField()


我可以通过显式调用
TextField(“0”,text:self.$app.fields[1].value)
来获得想要的行为,但我希望能够使用
ForEach
来实现这一点,这样我就可以从数组中构造一个通用表单。

以下是这种情况的解决方案:

ForEach(Array(app.fields.enumerated()), id: \.1.id) { i, field in
    HStack {
        Button(action: { self.app.update(label: field.label) } ) {Text(field.label)}
        TextField("0", text: self.$app.fields[i].value)
    }
}

以下是这种情况的解决方案:

ForEach(Array(app.fields.enumerated()), id: \.1.id) { i, field in
    HStack {
        Button(action: { self.app.update(label: field.label) } ) {Text(field.label)}
        TextField("0", text: self.$app.fields[i].value)
    }
}

公认的答案看起来是一个很好的通用解决方案。对于特定情况,可以通过为与数组中的位置相对应的每个
字段设置整数
id
来解决

class Field :  Identifiable, CustomStringConvertible {
    let id : Int
    var label : String
    var value : String
    
    ...
然后该
id
可用于
TextField
参数:

struct ContentView: View {
    @EnvironmentObject var app: App
        
    var body: some View {
        Form {
            ForEach(app.fields) { field in
                HStack {
                    Button(action: { self.app.update(label: field.label) } ) {Text(field.label)}
                    TextField("0", text: self.$app.fields[field.id].value)
                }
            }
        }
    }
}

公认的答案看起来是一个很好的通用解决方案。对于特定情况,可以通过为与数组中的位置相对应的每个
字段设置整数
id
来解决

class Field :  Identifiable, CustomStringConvertible {
    let id : Int
    var label : String
    var value : String
    
    ...
然后该
id
可用于
TextField
参数:

struct ContentView: View {
    @EnvironmentObject var app: App
        
    var body: some View {
        Form {
            ForEach(app.fields) { field in
                HStack {
                    Button(action: { self.app.update(label: field.label) } ) {Text(field.label)}
                    TextField("0", text: self.$app.fields[field.id].value)
                }
            }
        }
    }
}

谢谢@Asperi。这达到了我想要的。对于我的具体情况,如果我为字段设置一个显式id,我可以使问题变得简单一点,我将其作为一个单独的答案发布感谢@Asperi。这达到了我想要的。对于我的具体情况,如果我为字段设置一个显式id,我可以将其作为一个单独的答案发布,那么问题会变得简单一些