在我们完成这个应用程序之前,让我们做一些小的更改,以帮助完善我们所拥有的东西。
首先,如果用户查看他们的订单并决定反对其中一个项目,会发生什么?现在,我们可以添加项目,但不能删除它们,但解决这个问题并不难。
就像UIKit一样,SwiftUI的List
视图可以使用IndexSet
进行操作——其数据中位置的集合。因此,我们可以在OrderView
中添加一个接受IndexSet的方法,并使用它从我们的订单数组中删除这些项目:
func deleteItems(at offsets: IndexSet) {
order.items.remove(atOffsets: offsets)
}
要将其连接到SwiftUI,我们需要在ForEach
中添加一个onDelete()
修饰符,以显示顺序中的菜单项。这接受一个闭包,该闭包将在删除发生时执行,该闭包必须接受IndexSet并删除这些项目——基本上与我们的deleteItems(at:)
方法已经所做的完全一致。
将OrderView
表单中的第一个部分修改为:
Section {
ForEach(order.items) { item in
HStack {
Text(item.name)
Spacer()
Text("$\(item.price)")
}
}
.onDelete(perform: deleteItems)
}
如果用户想一次删除多个项目,在SwiftUI中也很容易做到。我们刚刚添加了处理删除的方法,所以现在我们可以在导航栏中添加一个编辑按钮,让SwiftUI处理其余部分。不,真的!
在OrderView
的navigationTitle()
修饰符之后添加这个:
.toolbar {
EditButton()
}
SwiftUI已经知道,编辑按钮应该在编辑和非编辑模式之间切换表格,同时在编辑和完成之间更改标题——这是我们免费获得系统默认行为的另一个例子。
让我们进入第二个升级:如果用户没有在订单中添加任何东西,我们为什么要让用户按下“下订单”按钮?这说不通,我们真的不应该允许它。所以,我们不要允许它!
以下是OrderView
的这一部分现在的样子:
Section {
NavigationLink("Place Order") {
CheckoutView()
}
}
我们想要的是,当我们的订单中没有项目时,可以禁用它。好吧,多亏了SwiftUI的力量,我们可以用disabled()
修饰符做到这一点,像这样:
Section {
NavigationLink("Place Order") {
CheckoutView()
}
}
.disabled(order.items.isEmpty)
如果您现在运行该应用程序,您会发现您可以添加一个项目,转到订单屏幕,然后删除该项目,当您的购物车为空时,下订单将自动禁用。
好多了!
[本文翻译自hackingwithswift,点击链接阅读原文]
评论区