步进器使用绑定结构崩溃视图中的变量?
Stepper using Variables from Binding Structs Crashes View?
我正在使用来自前一个视图的@Binding 在视图之间传递一个对象。结构设计如下:
struct Topping: Identifiable {
let name: String
let price: Double
var amount: Int
let id = UUID()
}
// Ex. Topping(name: "Cheese", price: 3.00, amount: 0)
struct ToppingList: Identifiable {
let name: String
var list: [Topping]
var id: String {
name+"menu\(menu.indices)"
}
}
// Ex. ToppingList(name: "Cheeses", menu: [Topping(...), Topping(...)])
struct MenuItem: Identifiable {
let name: String
let description: String
let size: [String]
let image: String
let price: [Double]
var toppings: [ToppingList]
var id: String {
"_"+name
}
}
// Ex. MenuItem(...toppings: [Topping(name: "Cheese", price: 3.00, amount: 0), Topping(name: "Pepperoni", price: 3.00, amount: 0)])
我将浇头列表传递给视图,并希望通过步进器增加或减少浇头的数量(每个独特的浇头)。出现的问题是当发生这种情况时,视图崩溃到我的主页。
视图的代码分为 2 个 - 一个用于在表单中显示步进器的行,子视图 - 用于单独的行。
// This view is the main view,
struct ToppingCategoryView: View {
@Binding var menuItem: MenuItem
// Pretend this is the MenuItem passed:
// MenuItem(...toppings: ToppingList(name: "Cheeses", list: [Topping(name: "Mozza", price: 3.00, amount: 0), Topping(name: "Parmesan", price: 3.00, amount: 0)]))
var body: some View {
VStack {
Form {
ForEach($menuItem.toppings) { $menu in
Section (menu.name){
ExtraToppingsView(toppingsList: $menu.list)
}
}
}
}
}
下面的视图是步进器和@Binding 变量所在的位置。我想增加浇头的量。这样做会驳回观点,但仍会增加变量。如果我再次加载视图,它会正确显示。不确定为什么该观点被驳回。没有我可以重现或找到的错误消息或警告。
struct ExtraToppingsView: View {
@Binding var toppingsList: [Topping]
var body: some View {
VStack {
ForEach($toppingsList) { $topping in
Stepper {
Text("\(topping.amount)")
} onIncrement: {
topping.amount += 1
if topping.amount >= 4 { topping.amount = 3 }
} onDecrement: {
topping.amount -= 1
if topping.amount <= -1 { topping.amount = 0 }
}
}
}
}
}
我弄明白问题出在哪里了,似乎是某种错误或其他我不知道的问题。
它与使用嵌套导航链接有关。
要解决此问题,我只需将 .isDetailLink(False)
添加到项目中的每个 NavigationLink。这解决了问题。
我正在使用来自前一个视图的@Binding 在视图之间传递一个对象。结构设计如下:
struct Topping: Identifiable {
let name: String
let price: Double
var amount: Int
let id = UUID()
}
// Ex. Topping(name: "Cheese", price: 3.00, amount: 0)
struct ToppingList: Identifiable {
let name: String
var list: [Topping]
var id: String {
name+"menu\(menu.indices)"
}
}
// Ex. ToppingList(name: "Cheeses", menu: [Topping(...), Topping(...)])
struct MenuItem: Identifiable {
let name: String
let description: String
let size: [String]
let image: String
let price: [Double]
var toppings: [ToppingList]
var id: String {
"_"+name
}
}
// Ex. MenuItem(...toppings: [Topping(name: "Cheese", price: 3.00, amount: 0), Topping(name: "Pepperoni", price: 3.00, amount: 0)])
我将浇头列表传递给视图,并希望通过步进器增加或减少浇头的数量(每个独特的浇头)。出现的问题是当发生这种情况时,视图崩溃到我的主页。
视图的代码分为 2 个 - 一个用于在表单中显示步进器的行,子视图 - 用于单独的行。
// This view is the main view,
struct ToppingCategoryView: View {
@Binding var menuItem: MenuItem
// Pretend this is the MenuItem passed:
// MenuItem(...toppings: ToppingList(name: "Cheeses", list: [Topping(name: "Mozza", price: 3.00, amount: 0), Topping(name: "Parmesan", price: 3.00, amount: 0)]))
var body: some View {
VStack {
Form {
ForEach($menuItem.toppings) { $menu in
Section (menu.name){
ExtraToppingsView(toppingsList: $menu.list)
}
}
}
}
}
下面的视图是步进器和@Binding 变量所在的位置。我想增加浇头的量。这样做会驳回观点,但仍会增加变量。如果我再次加载视图,它会正确显示。不确定为什么该观点被驳回。没有我可以重现或找到的错误消息或警告。
struct ExtraToppingsView: View {
@Binding var toppingsList: [Topping]
var body: some View {
VStack {
ForEach($toppingsList) { $topping in
Stepper {
Text("\(topping.amount)")
} onIncrement: {
topping.amount += 1
if topping.amount >= 4 { topping.amount = 3 }
} onDecrement: {
topping.amount -= 1
if topping.amount <= -1 { topping.amount = 0 }
}
}
}
}
}
我弄明白问题出在哪里了,似乎是某种错误或其他我不知道的问题。
它与使用嵌套导航链接有关。
要解决此问题,我只需将 .isDetailLink(False)
添加到项目中的每个 NavigationLink。这解决了问题。