基于用户输入使用SwiftUI创建动态文本框。

5
我正在尝试创建一组动态的文本字段(TextFields),当用户按下“添加(add)”按钮后,将添加这些字段的另一个集合。每次按下按钮都会添加另一组字段。由于我是新手,请谅解。我遇到了一个致命错误:索引超出范围。这里有一个简单的示例,演示我所试图实现的内容。
struct ContentView: View {

    @State var name: [String] = []
    @State var counter = 0

    var body: some View {
        Form {
            Section {
                ForEach(0..<counter, id: \.self) { index in
                    TextField("Name", text: self.$name[index])
                }


                Button(action:{
                    self.counter += 1
                }) {
                    Text("Add more")
                }
            }
        }
    }
}
2个回答

7

您在不添加新项目的情况下增加了计数器。如果您向数组中添加新项目,则可以正常工作而没有错误:

Button(action:{
    self.name.append("")
    self.counter += 1
}) {
    Text("Add more")
}

但最好不要使用counter变量。如果你向names数组添加了一个新项,它的计数就会自动增加。您可以在ForEach循环中像这样使用它:

ForEach(0..<names.count, id: \.self) { index in
    TextField("Name", text: self.$names[index])
}

Button(action:{
    self.names.append("")
}) {
    Text("Add more")
}

注意:对于数组,最好使用复数形式的名称:names 而不是 name。这表明它是一个集合


嗨,Pawello。那个方法可行,但需要将文本与名称索引数组一起使用。谢谢。 - oalansari82

-3

SWIFTUI: 这是显示多个动态元素的代码:

@State var textsArray = ["a","b","c","d"]

    HStack{ ForEach(textsArray, id: \.self)  
    { text in   
     Text("\(text)") 
      }   
     }

您可以将更多文本添加到“textsArray”中,或者您可以更改“textsArray”中的值,它将自动更改UI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接