繁体   English   中英

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

[英]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.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 不会检测到更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM