【发布时间】:2020-01-07 03:19:49
【问题描述】:
我想在 EditMode 改变时执行一个动作。
具体来说,在编辑模式下,用户可以选择一些要删除的项目。之后他通常会按下垃圾桶按钮。但他也可能按“完成”。当他稍后再次按下编辑时,之前选择的项目仍然被选中。我想清除所有项目。
struct ContentView: View {
@State var isEditMode: EditMode = .inactive
@State var selection = Set<UUID>()
var items = [Item(), Item(), Item(), Item(), Item()]
var body: some View {
NavigationView {
List(selection: $selection) {
ForEach(items) { item in
Text(item.title)
}
}
.navigationBarTitle(Text("Demo"))
.navigationBarItems(
leading: EditButton(),
trailing: addDelButton
)
.environment(\.editMode, self.$isEditMode)
}
}
private var addDelButton: some View {
if isEditMode == .inactive {
return Button(action: reset) {
Image(systemName: "plus")
}
} else {
return Button(action: reset) {
Image(systemName: "trash")
}
}
}
private func reset() {
selection = Set<UUID>()
}
}
项目定义:
struct Item: Identifiable {
let id = UUID()
let title: String
static var i = 0
init() {
self.title = "\(Item.i)"
Item.i += 1
}
}
【问题讨论】:
-
酷,除了现在选择元素的气泡不再出现...所以真正的 EditButton 必须与将 editMode 设置为 active 不同。
-
另外,我还需要将
editMode设为@State变量,以便当editMode 处于非活动状态时,“废纸篓”按钮会变回一个+。