EditButton 是 SwiftUI 提供的一个内置组件,用于切换视图的编辑模式。它在 List 和类似视图中非常常用,用来快速启用和退出编辑状态,例如多选、删除、移动项目等。
基本功能
EditButton 的作用:
它会自动在界面上显示一个按钮,通常标题是 “Edit”(编辑)或 “Done”(完成)。
点击 “Edit” 按钮后,支持编辑的视图(例如 List)会切换到编辑模式,用户可以进行多选、删除、排序等操作。
再次点击 “Done” 后,会退出编辑模式。
使用方式
EditButton 通常与 List 配合使用。
import SwiftUI
struct ContentView: View {
    @State private var items = ["Apple", "Banana", "Cherry"]
    @State private var selection = Set<String>() // 用于多选
    var body: some View {
        NavigationStack {
            List(items, id: \.self, selection: $selection) { item in
                Text(item)
            }
            .navigationTitle("Fruits")
            .toolbar {
                EditButton() // 在工具栏添加编辑按钮
            }
        }
    }
}
#Preview {
    ContentView()
}
运行效果
1、默认状态:
列表是不可编辑的,用户点击项目后只会高亮或执行某个操作。
2、点击 Edit 按钮:
列表进入编辑模式,显示复选框,用户可以进行多选。
3、点击 Done 按钮:
列表退出编辑模式,多选框消失。

主要特性
1、自动切换模式:
EditButton 会自动管理编辑模式的切换,不需要手动写代码来控制。
2、与 List 的 selection 配合:
如果为 List 设置了 selection 属性(例如绑定到一个 Set),进入编辑模式后会自动启用多选功能。
3、与 onDelete 和 onMove 配合:
在编辑模式下,可以启用删除或移动功能(例如通过手势或按钮删除项目)。
更复杂的用法
允许删除和重新排序
import SwiftUI
struct ContentView: View {
    @State private var items = ["Apple", "Banana", "Cherry"]
    var body: some View {
        NavigationStack {
            List {
                ForEach(items, id: \.self) { item in
                    Text(item)
                }
                .onDelete(perform: deleteItems) // 删除操作
                .onMove(perform: moveItems)    // 移动操作
            }
            .navigationTitle("Fruits")
            .toolbar {
                EditButton() // 启用编辑按钮
            }
        }
    }
    func deleteItems(at offsets: IndexSet) {
        items.remove(atOffsets: offsets) // 从数组中删除项目
    }
    func moveItems(from source: IndexSet, to destination: Int) {
        items.move(fromOffsets: source, toOffset: destination) // 调整数组顺序
    }
}
#Preview {
    ContentView()
}
运行效果
1、点击 Edit 按钮,List 的项目右侧会显示删除按钮,同时支持拖动排序。
2、点击 Done 按钮,退出编辑模式,删除按钮和拖动控件消失。

自定义按钮
如果不想用默认的 EditButton,也可以通过 @Environment(\.editMode) 自定义按钮实现类似功能。
自定义示例
import SwiftUI
struct ContentView: View {
    @Environment(\.editMode) private var editMode
    @State private var items = ["Apple", "Banana", "Cherry"]
    var body: some View {
        VStack {
            List {
                ForEach(items, id: \.self) { item in
                    Text(item)
                }
                .onDelete(perform: deleteItems)
            }
            Button(editMode?.wrappedValue == .active ? "Done" : "Edit") {
                withAnimation {
                    editMode?.wrappedValue = editMode?.wrappedValue == .active ? .inactive : .active
                }
            }
            .padding()
        }
    }
    func deleteItems(at offsets: IndexSet) {
        items.remove(atOffsets: offsets)
    }
}
#Preview {
    ContentView()
}

总结
EditButton 是一个方便的工具,用于启用和退出视图的编辑模式。
它适合配合 List 使用,尤其是需要多选、删除、重新排序等功能时。
如果需要更多控制,可以使用 @Environment(\.editMode) 自定义行为。
				    