如何在 SwiftUI 中单击按钮时动态添加表单组?
How to add form groups dynamically on button click in SwiftUI?
我想制作一个需要在单击按钮时动态添加更多字段的表单。
每次点击时,我都会附加 2 个字段(一个组)。
到目前为止我已经尝试过:
我创建了一个字典数组来保存这 2 个字段(组)的值。
看起来像这样。
@State var record = [["before": 300, "after": 280],["before": 300, "after": 260]]
然后我有一个按钮,点击它(递增计数器)我将字典附加到上面的数组,这样它应该添加一个新的表单组(2 个字段)
这是我的观点,我正在使用 forEach 循环和渲染项目。
ForEach(0..<counter, id: \.self) { index in
TextField("Before value", text: $record[index]["before"])
TextField("After value", text: $record[index]["after"])
}
但是这样做会出现以下错误。
如何让它工作?
谢谢!
TextField
必须需要 String
绑定,并且在您的代码中,您使用的是 Int
。所以首先你需要将你的字典声明为 [String: String]
类型,然后使用自定义绑定。像这样。
@State var record = [["before": "300", "after": "280"],["before": "300", "after": "260"]]
TextField("Before value", text: Binding(get: {(record[0]["before"] ?? "")}, set: {record[0]["before"] = [=10=]}))
TextField("After value", text: Binding(get: {(record[0]["after"] ?? "")}, set: {record[0]["after"] = [=10=]}))
如果你还想用 Int 的话你可以用这个。
@State var record = [["before": 300, "after": 280],["before": 300, "after": 260]]
TextField("Before value", value: Binding(get: {(record[0]["before"])}, set: {record[0]["before"] = [=11=]}), formatter: NumberFormatter())
我想制作一个需要在单击按钮时动态添加更多字段的表单。 每次点击时,我都会附加 2 个字段(一个组)。 到目前为止我已经尝试过:
我创建了一个字典数组来保存这 2 个字段(组)的值。
看起来像这样。
@State var record = [["before": 300, "after": 280],["before": 300, "after": 260]]
然后我有一个按钮,点击它(递增计数器)我将字典附加到上面的数组,这样它应该添加一个新的表单组(2 个字段)
这是我的观点,我正在使用 forEach 循环和渲染项目。
ForEach(0..<counter, id: \.self) { index in
TextField("Before value", text: $record[index]["before"])
TextField("After value", text: $record[index]["after"])
}
但是这样做会出现以下错误。
如何让它工作? 谢谢!
TextField
必须需要 String
绑定,并且在您的代码中,您使用的是 Int
。所以首先你需要将你的字典声明为 [String: String]
类型,然后使用自定义绑定。像这样。
@State var record = [["before": "300", "after": "280"],["before": "300", "after": "260"]]
TextField("Before value", text: Binding(get: {(record[0]["before"] ?? "")}, set: {record[0]["before"] = [=10=]}))
TextField("After value", text: Binding(get: {(record[0]["after"] ?? "")}, set: {record[0]["after"] = [=10=]}))
如果你还想用 Int 的话你可以用这个。
@State var record = [["before": 300, "after": 280],["before": 300, "after": 260]]
TextField("Before value", value: Binding(get: {(record[0]["before"])}, set: {record[0]["before"] = [=11=]}), formatter: NumberFormatter())