【发布时间】:2021-05-20 08:43:14
【问题描述】:
我的 UIView 需要有一个对象传递给它,然后它才能显示为活动工作表。传入其中的对象取决于用户单击的按钮。这就是为什么我写了一些这样的代码。
struct DetailInfoView: View {
var cat: Cat
@EnvironmentObject var modelData: ModelData
@State var activeSheet: DetailViewActiveSheet?
@State var selectedFood: Food?
var body: some View {
ZStack {
ForEach(foods, id:\.self) {food in
Button(action: {
selectedFood = food
activeSheet = .foodDetailView
}, label: {
Text(food.name).font(.caption2).padding(.top, -5.0)
})
}
}
}.sheet(item: $activeSheet) { item in
switch item {
case .foodDetailView:
FoodDetailView(food: self.selectedFood!)
}
}
}
然后我发现即使我在按钮操作中设置了 selectedFood ,它也永远为零并导致异常。为什么会这样?
FoodDetailView 没有什么特别之处。
struct FoodDetailView: View {
var food: Food
var body: some View {
Text(food.name)
}
}
我有另一个视图将显示我所有的 FoodDetailView。每当我将 var food 更改为 FoodDetailView 的 @binding var food 时,它都会抱怨。
TabView() {
ForEach(modelData.foods) { food in
FoodDetailView(food: food)
}
}.tabViewStyle(PageTabViewStyle())
也许是为了澄清我的问题——应该是:
- 我有多个活动工作表。这就是为什么 .sheet 将接收项目 $activeSheet 以便我知道应该显示哪个其他视图。
- 对于要显示的每个视图,它们可能需要自定义项。只有当用户单击按钮时才能创建项目。但是,似乎在创建视图时创建了 .sheet 和相关代码,因此导致了异常。有建议告诉我应该在这里使用@binding。
- 如果我对变量 selectedFood 使用@binding,那么如果我在其他视图中没有任何绑定食物变量,我可以知道如何创建 FoodDetailView() 吗?例如,我有一个食品列表,我使用 for 循环只是循环并创建 FoodDetailView。在这种情况下,当我循环 Food Item 列表时,它不是绑定变量。
所以我认为我的问题是 --- 如何使在 .sheet() 中创建的那些 View 可以即时创建?
【问题讨论】:
-
您的
item应该是self.selectedFood,即。模型,而不是视图。 -
能分享一下
DetailViewActiveSheet的模特吗? -
枚举 DetailViewActiveSheet: Identifiable { case FoodView case AudioView var id:Int { hashValue } }