Я пытаюсь связать массив строк в соответствующие текстовые поля в списке прокрутки. Количество строк является переменным и соответствует количеству элементов в массиве строк. Пользователь может добавлять или удалять строки, а также изменять текст в каждой строке.
Следующий код Playground является упрощенной версией того, чего я пытаюсь достичь.
import SwiftUI
import PlaygroundSupport
struct Model {
struct Row : Identifiable {
var textContent = ""
let id = UUID()
}
var rows: [Row]
}
struct ElementCell: View {
@Binding var row: Model.Row
var body: some View {
TextField("Field",text: $row.textContent)
}
}
struct ElementList: View {
@Binding var model: Model
var body: some View {
List {
ForEach($model.rows) {
ElementCell(row: $0)
}
}
}
}
struct ContentView: View {
@State var model = Model(rows: (1...10).map({ Model.Row(textContent:"Row \($0)") }))
var body: some View {
NavigationView {
ElementList(model: $model)
}
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
Проблема в том, что я не могу заставить "ячейку" правильно связываться с соответствующим элементом. В приведенном выше примере кода Xcode 11.1 не удалось скомпилировать его с ошибкой в строке 26:
error: Text-Field Row.xcplaygroundpage:26:13: error: cannot invoke initializer for type 'ForEach<_, _, _>' with an argument list of type '(Binding<[Model.Row]>, @escaping (Binding<Model.Row>) -> ElementCell)'
ForEach($model.rows) {
^
Text-Field Row.xcplaygroundpage:26:13: note: overloads for 'ForEach<_, _, _>' exist with these partially matching parameter lists: (Data, content: @escaping (Data.Element) -> Content), (Range<Int>, content: @escaping (Int) -> Content)
ForEach($model.rows) {
^
Каков рекомендуемый способ привязки элементов, являющихся результатом ForEach, к его родительской модели?