1

我有一个 LazyVStack 展示单元格。我的拥有 LazyVStack 的主视图有一个 viewModel。

@StateObject private var model = ViewModel()

Stack 提供了一个 CustomViews 列表。

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

每个自定义视图都由另外两个子视图 CustomView1 和 CustomView2 组成。CustomView2 有一个按钮,我想在其中 onTap 翻转单元格。

但是,那时我的自定义视图有这些项目(结构)的新副本。指向模型以实现的最佳方法是什么:

.onTapGesture {
   model.flipItem(item)
}
  • 不知何故,多个@Binding 变量是一个选项?
  • 制作 ViewModel 共享单例以便于访问?
  • 更好的选择?
4

1 回答 1

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()
            }
    }
}
于 2021-05-22T16:19:01.880 回答