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.modelsBinding<[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的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI ForEach Binding 编译时错误看起来不像 for-each

带有 @Binding 控件的 SwiftUI 动态列表

SwiftUI PickerView 与工作回调如何?

从 SwiftUI 的列表中删除列表元素

从 SwiftUI 的列表中删除列表元素

SwiftUI .onDelete 抛出致命错误:索引超出范围