我有点不知道如何使用动态表单的状态。我肯定不能为每个字段创建状态,因为我不知道有多少字段,因为这些表单基本上是从JSON响应构建的。
这是我现在所拥有的,也是我想要改变的,最初我为每个字段创建了一个状态,那时表单还没有动态构建,现在我陷入了如何继续的困境。
我想过使用字典,但我不知道这是一个多么好的解决方案。
@State var textfieldText: String = ""
@State var SKU: String = ""
@State private var showScanner: Bool = false
var currentForm: FormModel
@State var RecordDate: Date = Date.now
@State var Formresponse: [String: Any] = [:]//This one is set to any because the value can vary from a string to [] to even a whole object
如何呈现窗体:
ForEach(currentForm.item, id:\.idf) { it in
if (!it.questionItem.hidden)
{
switch it.questionItem.questionType {
case .dateQuestion :
DateField(title: it.title, currentDate: $RecordDate)
case .choiceQuestion:
Text("choice question")
case .scannerQuestion:
ScannerField(title: it.title, SKU: $SKU, showScanner: $showScanner)
case .textQuestion:
TextQuestionField(title: it.title, email: currentForm.owner, text: $textfieldText)
}
}
}
我最终将不得不以字典的形式提交这些数据,这就是为什么我考虑使用Dict [“fieldID”:“FieldInput”,“fieldId2”:“FieldInput2”..]
2条答案
按热度按时间ryevplcw1#
为问题类型定义枚举:
定义问题类型的项目模型:
定义表单视图模型:
和视图:
下面是表单的虚拟值:
结果是:
roejwanj2#
我认为你只需要一个
State
,这是针对formResponse
的,你可以把它作为Binding
传递给每个输入字段视图,在该视图中你可以创建一个自定义的Binding
来获取和设置formResponse
的答案,类似于这样: