SwiftUI ForEach Binding 编译时错误看起来不像 for-each
Posted
技术标签:
【中文标题】SwiftUI ForEach Binding 编译时错误看起来不像 for-each【英文标题】:SwiftUI ForEach Binding compile time error looks like not for-each 【发布时间】:2020-07-21 19:08:49 【问题描述】:我从 SwiftUI 开始,关注 WWDC 视频,我从两个视图之间的 @State
和 @Binding
开始。我有一个正确的显示,但不知道如何使回溯读写 WWDC 视频中未包含的内容。
我有模型类:
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 preview picture
但现在我想修改我的代码以允许编辑显示的模型并将其保存到我的模型@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
填充但无法获得每个绑定工作 - 我该怎么做?
【问题讨论】:
这可能与问题没有直接关系,但您是否打算使用manufacturer.models
数组的每个元素的绑定,例如TextField("update name", item.name)
?
是的!这正是我想要在这里完成的!
【参考方案1】:
首先,我假设你有类似的东西:
@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 不会检测到更改。
【讨论】:
谢谢!工作,我现在有了一个概念,真的很有帮助!以上是关于SwiftUI ForEach Binding 编译时错误看起来不像 for-each的主要内容,如果未能解决你的问题,请参考以下文章