[英]SwiftUI ForEach Binding compile time error looks like not for-each
我从 SwiftUI 开始,然后跟随 WWDC 视频,我从两个视图之间的@State
和@Binding
开始。 我得到了一个正确的显示,但不知道如何使回溯读写 WWDC 视频中不包含的内容。
我有 model 类:
class Manufacturer {
let name: String
var models: [Model] = []
init(name: String, models: [Model]) {
self.name = name
self.models = models
}
}
class Model: Identifiable {
var name: String = ""
init(name: String) {
self.name = name
}
}
然后我有一个绘图代码来按预期显示该工作:
var body: some View {
VStack {
ForEach(manufacturer.models) { model in
Text(model.name).padding()
}
}.padding()
}
我看到了这个: Canvas 预览图片
但是现在我想修改我的代码以允许编辑显示的模型并将其保存到我的 model @Binding
所以我将视图更改为:
var body: some View {
VStack {
ForEach(self.$manufacturer.models) { item in
Text(item.name)
}
}.padding()
}
但是在ForEach
行中出现错误:
无法推断通用参数“ID”
什么ID参数? 我在这里一无所知...我认为Identifiable
在这里充当标识符。
那么我的问题是:我有一个视图(ContentView)将我的数据源“保存”为@State
变量。 然后我将它作为@Binding
传递给我的ManufacturerView
想要在List
中使用ForEach
填充来编辑它,但无法让每个绑定工作 - 我该怎么做?
首先,我假设你有类似的东西:
@ObservedObject var manufacturer: Manufacturer
否则你不会有self.$manufacturer
开始(这也要求Manufacturer
符合ObservableObject
)。
self.$manufacturer.models
是Binding<[Model]>
的一种,因此它不是RandomAccessCollection
,例如self.manufacturer.models
,这是ForEach.init
接受的重载之一。
而且,如果您使用ForEach(self.manufacturer.models) { item in... }
,那么item
将不会是绑定,而这正是您所需要的,例如TextField
。
一种解决方法是迭代索引,然后绑定到$manufacturer.models[index].name
:
ForEach(manufacturer.indices) { index in
TextField("model name", self.$manufacturer.models[index].name)
}
除此之外,我建议您将Model
(甚至可能是Manufacturer
)设置为值类型,因为它似乎只是数据的存储:
struct Model: Identifiable {
var id: UUID = .init()
var name: String = ""
}
这不会帮助解决这个问题,但它会消除值未更新的可能问题,因为 SwiftUI 不会检测到更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.