SwiftUI - изменить модель из вложенных подвидов

У меня есть LazyVStack, представляющий ячейки. В моем основном представлении, в котором есть LazyVStack, есть viewModel.

      @StateObject private var model = ViewModel()

Стек представляет список CustomViews.

      LazyVStack {
    ForEach(model.items) { item in
       CustomView(item: item)
    }
}

Каждое настраиваемое представление состоит из двух других подпредставлений, CustomView1 и CustomView2. CustomView2 имеет кнопку, где я хочу перевернуть ячейку onTap.

Однако в этот момент в моих пользовательских представлениях появилась новая копия этих элементов (структура). Как лучше всего указать на модель для достижения:

      .onTapGesture {
   model.flipItem(item)
}
  • Каким-то образом несколько переменных @Binding - это вариант?
  • Делать общий синглтон ViewModel для облегчения доступа?
  • Лучший вариант?

1 ответ

Я бы добавил недвижимость внутри вашего Item структура, которая хранит, перевернута карта или нет:

      struct Item {
    var ifFlipped = false
    ...
}
model.items = [Item(), Item()]

Затем перебрать model.items.indices, так что вы можете получить Binding:

      LazyVStack {
    ForEach(model.items.indices, id: \.self) { index in
       CustomView(item: $model.items[index]) /// this will be a Binding<Item>
    }
}

И ваш CustomView/ CustomView1 должен будет выглядеть примерно так.

      struct CustomView: View {
    @Binding var item: Item
    
    var body: some View {
        CustomView1(item: $item) /// pass Binding down
    }
}

struct CustomView1: View {
    @Binding var item: Item
    
    var body: some View {
        Text("Hi")
            .onTapGesture {
                item.isFlipped.toggle()
            }
    }
}
Другие вопросы по тегам