Бесконечный цикл с использованием @Binding при передаче данных между представлениями
Описание высокого уровня:
Существует проблема вложенного представления, когда объект состояния передается через представления. В конце самого глубокого представления в иерархии приложение зависает, а потребление памяти постоянно увеличивается.
Вариант использования
Список партнеров → Сведения о партнере → (Список местоположений) → Сведения о местоположении
Фрагменты кода
class PartnerViewModel: ObservableObject {
@Published var partners: [Partner] = Partner.partners
}
Это представление загружается вTabView
иNavigationStack
компоненты родительского класса.
struct PartnerListView: View {
@StateObject var viewModel = PartnerViewModel()
var body: some View {
List($viewModel.partners, id: \.self) { $partner in
NavigationLink {
PartnerDetailView(partner: $partner)
} label: {
Text(partner.name)
}
}
}
}
struct PartnerDetailView: View {
@Binding var partner: Partner
var body: some View {
Form {
Section("Locations") {
List($partner.locations, id: \.self) { $location in
NavigationLink {
LocationDetailView(location: $location)
} label: {
Text(location.name)
}
}
}
}
}
}
struct LocationDetailView: View {
@Binding var location: Location
var body: some View {
TextField("Name", text: $location.name)
}
}
Следующие фрагменты являются обходным путем, и он работает, но может быть временным, потому что я не понимаю, почему первая попытка не работает и почему работает эта. Я не нашел никаких ресурсов, которые могли бы привести пример этого сценария.
struct PartnerDetailView: View {
@Binding var partner: Partner
var body: some View {
Form {
Section("Locations") {
List($partner.locations, id: \.self) { $location in
NavigationLink {
LocationDetailView(partner: $partner, locationIndex: partner.locations.firstIndex(of: location) ?? 0)
} label: {
Text(location.name)
}
}
}
}
}
}
struct LocationDetailView: View {
@Binding var partner: Partner
var locationIndex: Int
var body: some View {
TextField("Name", text: $partner.locations[locationIndex].name)
}
}
Возможно ли, что я неправильно передаю значения между представлениями?