我的目标是从 JSON 动态生成表单。除了生成 FormField 视图(基于 TextField)并绑定到动态生成的视图模型列表之外,我已将所有内容放在一起。
如果我将 FormField 视图替换为普通的 Text 视图,则效果很好(请参见屏幕截图):
ForEach(viewModel.viewModels) { vm in
Text(vm.placeholder)
}
for
ForEach(viewModel.viewModels) { vm in
FormField(viewModel: $vm)
}
我已经尝试过viewModels
的财产ConfigurableFormViewModel
@State var,但它失去了它的可编码性。 JSON > Binding
这是我的要点code https://gist.github.com/erd-s/7351e32569754f8b7eeff91bb7dd150c:
您可以尝试的第一件事是:
ForEach(0 ..< numberOfItems) { index in
HStack {
TextField("PlaceHolder", text: Binding(
get: { return items[index] },
set: { (newValue) in return self.items[index] = newValue}
))
}
}
先前方法的问题在于,如果numberOfItems
是动态的,并且可能会因为按钮的操作而改变,例如,它不会工作,并且会抛出以下错误:ForEach<Range<Int>, Int, HStack<TextField<Text>>> count (3) != its initial count (0). 'ForEach(_:content:)' should only be used for *constant* data. Instead conform data to 'Identifiable' or use 'ForEach(_:id:content:)' and provide an explicit 'id'!
如果你有这样的用例,你可以做这样的事情,即使项目在 SwiftView 的生命周期中增加或减少,它也会起作用:
ForEach(items.indices, id:\.self ){ index in
HStack {
TextField("PlaceHolder", text: Binding(
get: { return items[index] },
set: { (newValue) in return self.items[index] = newValue}
))
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)