【问题标题】:SwiftUI how to perform action when EditMode changes?SwiftUI 如何在 EditMode 更改时执行操作?
【发布时间】: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
    }
}

【问题讨论】:

  • 已经在这里回答:stackoverflow.com/a/57381570/3393964
  • 酷,除了现在选择元素的气泡不再出现...所以真正的 EditButton 必须与将 editMode 设置为 active 不同。
  • 另外,我还需要将editMode 设为@State 变量,以便当editMode 处于非活动状态时,“废纸篓”按钮会变回一个+。

标签: list swiftui editmode


【解决方案1】:

@Casper 为我指明了正确的方向。这是我想出的。这个解决方案用一块石头抓住了 2 只鸟:

  1. editMode 切换时,整个视图会自行重绘
  2. 可以在激活/停用 editMode 时执行特定操作

希望这对其他人有所帮助。

struct ContentView: View {
    @State var editMode: EditMode = .inactive
    @State var selection = Set<UUID>()
    @State var items = [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.$editMode)
        }
    }

    private var editButton: some View {
        Button(action: {
            self.editMode.toggle()
            self.selection = Set<UUID>()
        }) {
            Text(self.editMode.title)
        }
    }

    private var addDelButton: some View {
        if editMode == .inactive {
            return Button(action: addItem) {
                Image(systemName: "plus")
            }
        } else {
            return Button(action: deleteItems) {
                Image(systemName: "trash")
            }
        }
    }

    private func addItem() {
        items.append(Item())
    }

    private func deleteItems() {
        for id in selection {
            if let index = items.lastIndex(where: { $0.id == id }) {
                items.remove(at: index)
            }
        }
        selection = Set<UUID>()
    }
}
extension EditMode {
    var title: String {
        self == .active ? "Done" : "Edit"
    }

    mutating func toggle() {
        self = self == .active ? .inactive : .active
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2017-12-13
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多