ObservableObject
должно работать, если используется правильно, основная концепция SwiftUI имеет единый источник правды. Вот тут-то и появился Binding
, однако если вы перебираете список, вы получаете значение Person
, а не требуемое Binding<Person>
. Вы можете использовать индексы на протяжении итерации и передавать его в TextForm
, чтобы он мог получить исходный массив.
Чтобы сделать код более читабельным, я предлагаю иметь видовой модуль типа
class PeopleViewModel: ObservableObject {
@Published var people: [Person] = [
.init(lastname: "Some", firstname: "Dude"),
.init(lastname: "Other", firstname: "Dude"),
]
}
Который вы должны смотреть в представлении, используя оболочку @ObservedObject
.
struct PeopleList: View {
@ObservedObject var viewModel = PeopleViewModel()
var body: some View {
NavigationView {
List(viewModel.people.indices) { index in
TextForm(viewModel: self.viewModel, index: index)
}
}
}
}
И у TextForm
есть индекс и конец экземпляра модели представления.
struct TextForm: View {
@ObservedObject var viewModel: PeopleViewModel
var index: Int
var body: some View {
VStack {
TextField("textField", text: self.$viewModel.people[index].firstname)
Text(self.viewModel.people[index].firstname)
}
}
}
Если вы действительно хотите опустить модель представления, просто пропустите индексирование через привязку.
List(people.indices) { index in
TextForm(item: self.$people[index])
}
struct TextForm: View {
@Binding var item: Person
var body: some View {
VStack {
TextField("textField", text: self.$item.firstname)
Text(self.item.firstname)
}
}
}