我正在创建一个简单的程序,它可以创建几个文本字段进行编辑。我使用以下代码来创建它们:
ForEach((1...textfields).reversed(), id: .self){ _ in
TextField("Type here:", text: $text)
}
textfields
变量由代码前面的几个按钮控制,但真正的问题是";文本";变量按钮添加和删除文本字段,但编辑一个会编辑所有文本字段,这不是我想要的。所以我的问题是,如何创建包含唯一变量但仍然可以由ForEach
(或类似的(循环生成的文本字段?
问题
这里的任务是为TextField
的值组织某种存储。
解决方案
步骤1
可以使用@State
或@Binding
修饰符来组织存储。由于我们需要有多个TextField
,因此String
的Array
可能是存储类型的不错选择。这可以写成:
@State var values = ["1", "2", "3", "4", "5"]
请注意,我们在这里提供的初始值为空字符串。这只是为了举例说明。如果需要指定父视图中的值,可以使用所需的任何内容,也可以将@State
替换为@Binding
。
请注意,[String]
类型将由swift自动推断。
步骤2
然后,需要在视图的主体实现中将这些值转换为TextField
s。为此,我们对您的ForEach
进行了一点修改:
// iterating through the indices of the values
ForEach(values.indices, id: .self) { index in
// using index to create binding to the value
TextField("Type here:", text: $values[index])
}
结果
这是我们的最终结果:
struct MultipleTextViews: View {
@State var values: [String] = ["1", "2", "3", "4", "5"]
var body: some View {
ForEach(values.indices, id: .self) { index in
TextField("Type here:", text: $values[index])
}
}
}